/ Hex Artifact Content
Login

Artifact cd8fefa30afc0b480b2881c216465f6ba5ea185b1ef4acb9f3593c12dc3b05a8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
02f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0300: 55 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  U) || defined(SQ
0310: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 5f  LITE_ENABLE_ICU_
0320: 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a 23 20 69 6e  COLLATIONS).# in
0330: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63 75  clude "sqliteicu
0340: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h".#endif.#ifde
0350: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0360: 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74 65  JSON1.int sqlite
0370: 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74  3Json1Init(sqlit
0380: 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  e3*);.#endif.#if
0390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
03a0: 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20 73  E_STMTVTAB.int s
03b0: 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49 6e  qlite3StmtVtabIn
03c0: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
03d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
03e0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 69  TE_ENABLE_FTS5.i
03f0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
0400: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65  it(sqlite3*);.#e
0410: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0420: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0430: 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  N./* IMPLEMENTAT
0440: 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36 2d  ION-OF: R-46656-
0450: 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74 65  45156 The sqlite
0460: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69  3_version[] stri
0470: 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 63  ng constant.** c
0480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78 74  ontains the text
0490: 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49   of SQLITE_VERSI
04a0: 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f  ON macro. .*/.co
04b0: 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33  nst char sqlite3
04c0: 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c  _version[] = SQL
04d0: 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e  ITE_VERSION;.#en
04e0: 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  dif../* IMPLEMEN
04f0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33 35  TATION-OF: R-535
0500: 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71 6c  36-42575 The sql
0510: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
0520: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
0530: 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ns.** a pointer 
0540: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73 71  to the to the sq
0550: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20  lite3_version[] 
0560: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 2e  string constant.
0570: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
0580: 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  *sqlite3_libvers
0590: 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72  ion(void){ retur
05a0: 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  n sqlite3_versio
05b0: 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  n; }../* IMPLEME
05c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 35  NTATION-OF: R-25
05d0: 30 36 33 2d 32 33 32 38 36 20 54 68 65 20 73 71  063-23286 The sq
05e0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
05f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0600: 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  s a.** pointer t
0610: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  o a string const
0620: 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65 20  ant whose value 
0630: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
0640: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f 55  he.** SQLITE_SOU
0650: 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f 63  RCE_ID C preproc
0660: 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 45 78 63  essor macro. Exc
0670: 65 70 74 20 69 66 20 53 51 4c 69 74 65 20 69 73  ept if SQLite is
0680: 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20   built using.** 
0690: 61 6e 20 65 64 69 74 65 64 20 63 6f 70 79 20 6f  an edited copy o
06a0: 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  f the amalgamati
06b0: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  on, then the las
06c0: 74 20 66 6f 75 72 20 63 68 61 72 61 63 74 65 72  t four character
06d0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 68 61 73 68  s of.** the hash
06e0: 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72   might be differ
06f0: 65 6e 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  ent from SQLITE_
0700: 53 4f 55 52 43 45 5f 49 44 2e 0a 2a 2f 0a 63 6f  SOURCE_ID..*/.co
0710: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0720: 33 5f 73 6f 75 72 63 65 69 64 28 76 6f 69 64 29  3_sourceid(void)
0730: 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  { return SQLITE_
0740: 53 4f 55 52 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a  SOURCE_ID; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 33 35 32 31 30 2d 36 33 35 30  OF: R-35210-6350
0770: 38 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  8 The sqlite3_li
0780: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0790: 29 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  ) function.** re
07a0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
07b0: 20 65 71 75 61 6c 20 74 6f 20 53 51 4c 49 54 45   equal to SQLITE
07c0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e  _VERSION_NUMBER.
07d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
07e0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
07f0: 72 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  r(void){ return 
0800: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
0810: 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  UMBER; }../* IMP
0820: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0830: 52 2d 32 30 37 39 30 2d 31 34 30 32 35 20 54 68  R-20790-14025 Th
0840: 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  e sqlite3_thread
0850: 73 61 66 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  safe() function 
0860: 72 65 74 75 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20  returns.** zero 
0870: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 53  if and only if S
0880: 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69 6c  QLite was compil
0890: 65 64 20 77 69 74 68 20 6d 75 74 65 78 69 6e 67  ed with mutexing
08a0: 20 63 6f 64 65 20 6f 6d 69 74 74 65 64 20 64 75   code omitted du
08b0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e to.** the SQLI
08c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 63 6f  TE_THREADSAFE co
08d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
08e0: 6e 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 30  n being set to 0
08f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0900: 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f 69 64  _threadsafe(void
0910: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0920: 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d 0a 0a  _THREADSAFE; }..
0930: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 69  /*.** When compi
0940: 6c 69 6e 67 20 74 68 65 20 74 65 73 74 20 66 69  ling the test fi
0950: 78 74 75 72 65 20 6f 72 20 77 69 74 68 20 64 65  xture or with de
0960: 62 75 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20  bugging enabled 
0970: 28 6f 6e 20 57 69 6e 33 32 29 2c 0a 2a 2a 20 74  (on Win32),.** t
0980: 68 69 73 20 76 61 72 69 61 62 6c 65 20 62 65 69  his variable bei
0990: 6e 67 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65  ng set to non-ze
09a0: 72 6f 20 77 69 6c 6c 20 63 61 75 73 65 20 4f 53  ro will cause OS
09b0: 54 52 41 43 45 20 6d 61 63 72 6f 73 20 74 6f 20  TRACE macros to 
09c0: 65 6d 69 74 0a 2a 2a 20 65 78 74 72 61 20 64 69  emit.** extra di
09d0: 61 67 6e 6f 73 74 69 63 20 69 6e 66 6f 72 6d 61  agnostic informa
09e0: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
09f0: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
0a00: 52 41 43 45 0a 23 20 69 66 6e 64 65 66 20 53 51  RACE.# ifndef SQ
0a10: 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52  LITE_DEBUG_OS_TR
0a20: 41 43 45 0a 23 20 20 20 64 65 66 69 6e 65 20 53  ACE.#   define S
0a30: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
0a40: 52 41 43 45 20 30 0a 23 20 65 6e 64 69 66 0a 20  RACE 0.# endif. 
0a50: 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72   int sqlite3OSTr
0a60: 61 63 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 42  ace = SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 3b 0a 23 65 6e  UG_OS_TRACE;.#en
0a80: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
0a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
0aa0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
0ab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
0ac0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
0ad0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
0ae0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0af0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0b00: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0b10: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0b20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0b30: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0b40: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0b50: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0b60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0b70: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0b80: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
0b90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
0ba0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53  ivity only..*/.S
0bb0: 51 4c 49 54 45 5f 41 50 49 20 76 6f 69 64 20 28  QLITE_API void (
0bc0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71  SQLITE_CDECL *sq
0bd0: 6c 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f  lite3IoTrace)(co
0be0: 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20  nst char*, ...) 
0bf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c00: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0c10: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0c20: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0c30: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0c40: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0c50: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0c60: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0c70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0c80: 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61  store.** tempora
0c90: 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ry files..**.** 
0ca0: 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52  See also the "PR
0cb0: 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f  AGMA temp_store_
0cc0: 64 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63  directory" SQL c
0cd0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20  ommand..*/.char 
0ce0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
0cf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
0d00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0d10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
0d20: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
0d30: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
0d40: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
0d50: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
0d60: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
0d70: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
0d80: 20 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61   store.** all da
0d90: 74 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65  tabase files spe
0da0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65  cified with a re
0db0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
0dc0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0dd0: 74 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61  the "PRAGMA data
0de0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0df0: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0e00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0e10: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d  data_directory =
0e20: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69   0;../*.** Initi
0e30: 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a  alize SQLite.  .
0e40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
0e50: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
0e60: 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
0e70: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0e80: 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61  ation,.** VFS, a
0e90: 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  nd mutex subsyst
0ea0: 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  ems prior to doi
0eb0: 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77  ng any serious w
0ec0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69  ork with.** SQLi
0ed0: 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67  te.  But as long
0ee0: 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63   as you do not c
0ef0: 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49  ompile with SQLI
0f00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
0f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
0f20: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
0f30: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79  automatically by
0f40: 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75   key routines su
0f50: 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33  ch as.** sqlite3
0f60: 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  _open().  .**.**
0f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0f80: 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20   a no-op except 
0f90: 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73  on its very firs
0fa0: 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70  t call for the p
0fb0: 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f  rocess,.** or fo
0fc0: 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  r the first call
0fd0: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
0fe0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
0ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
1000: 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c  st thread to cal
1010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1020: 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69  uns the initiali
1030: 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d  zation to.** com
1040: 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62  pletion.  If sub
1050: 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20  sequent threads 
1060: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
1070: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  e before the fir
1080: 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73  st.** thread has
1090: 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e   finished the in
10a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
10b0: 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73  cess, then the s
10c0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72  ubsequent.** thr
10d0: 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20  eads must block 
10e0: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
10f0: 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20  thread finishes 
1100: 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
1110: 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ization..**.** T
1120: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
1130: 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20  might call this 
1140: 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76  routine recursiv
1150: 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a  ely.  Recursive.
1160: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73  ** calls to this
1170: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1180: 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f  not block, of co
1190: 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  urse.  Otherwise
11a0: 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   the.** initiali
11b0: 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77  zation process w
11c0: 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c  ould never compl
11d0: 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58  ete..**.** Let X
11e0: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68   be the first th
11f0: 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68  read to enter th
1200: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74  is routine.  Let
1210: 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72   Y be some other
1220: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65  .** thread.  The
1230: 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74  n while the init
1240: 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ial invocation o
1250: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
1260: 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70  y X is.** incomp
1270: 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75  lete, it is requ
1280: 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ired that:.**.**
1290: 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20      *  Calls to 
12a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
12b0: 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  m Y must block u
12c0: 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d  ntil the outer-m
12d0: 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c  ost.**       cal
12e0: 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73  l by X completes
12f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65  ..**.**    *  Re
1300: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f  cursive calls to
1310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
1320: 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75  om thread X retu
1330: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
1340: 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20  *       without 
1350: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  blocking..*/.int
1360: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1370: 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54  ize(void){.  MUT
1380: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
1390: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
13a0: 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ; )       /* The
13b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
13c0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ex */.  int rc; 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1400: 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ode */.#ifdef SQ
1410: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
1420: 20 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49    int bRunExtraI
1430: 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1450: 2a 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69  * Extra initiali
1460: 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f  zation needed */
1470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
1490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
14a0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
14b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14d0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
14e0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1500: 74 28 29 20 66 61 69 6c 73 20 6f 6e 20 73 6f 6d  t() fails on som
1510: 65 20 6f 62 73 63 75 72 65 20 70 72 6f 63 65 73  e obscure proces
1520: 73 6f 72 2f 63 6f 6d 70 69 6c 65 72 0a 20 20 2a  sor/compiler.  *
1530: 2a 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2c 20 74  * combination, t
1540: 68 65 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  he work-around i
1550: 73 20 74 6f 20 73 65 74 20 74 68 65 20 63 6f 72  s to set the cor
1560: 72 65 63 74 20 70 6f 69 6e 74 65 72 0a 20 20 2a  rect pointer.  *
1570: 2a 20 73 69 7a 65 20 61 74 20 63 6f 6d 70 69 6c  * size at compil
1580: 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53  e-time using -DS
1590: 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d 6e 20  QLITE_PTRSIZE=n 
15a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
15b0: 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ion */.  assert(
15c0: 20 53 51 4c 49 54 45 5f 50 54 52 53 49 5a 45 3d   SQLITE_PTRSIZE=
15d0: 3d 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29  =sizeof(char*) )
15e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74  ;..  /* If SQLit
15f0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d  e is already com
1600: 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69  pletely initiali
1610: 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63  zed, then this c
1620: 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69  all.  ** to sqli
1630: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1640: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d   should be a no-
1650: 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69  op.  But the ini
1660: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
1670: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74   must be complet
1680: 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75  e.  So isInit mu
1690: 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e  st not be set un
16a0: 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64  til the very end
16b0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  .  ** of this ro
16c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  utine..  */.  if
16d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
16f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1700: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1710: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1720: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1730: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1740: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1750: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1760: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1770: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1780: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1790: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
17a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
17b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
17c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
17d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
17e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
17f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1800: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1810: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1820: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1830: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1840: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1850: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1860: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1870: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1880: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1890: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
18a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
18b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
18c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
18d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
18e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
18f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1900: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1910: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1920: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1930: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1940: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1950: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1960: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1970: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1980: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1990: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
19a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
19b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
19c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
19d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
19e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
19f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1a00: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1a10: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a20: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a30: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a50: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1a60: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1a70: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1a80: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1a90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1aa0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1ab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1ac0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1ad0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ae0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1af0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b00: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1b10: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1b20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b30: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1b60: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1b70: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1b80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b90: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
1ba0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1bc0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1be0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1bf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c00: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1c10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1c40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1c50: 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20  efInitMutex++;. 
1c60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c70: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1c80: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69  );..  /* If rc i
1c90: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1ca0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
1cb0: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d  hen either the m
1cc0: 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79  alloc.  ** subsy
1cd0: 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62  stem could not b
1ce0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72  e initialized or
1cf0: 20 74 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c   the system fail
1d00: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
1d10: 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74   ** the pInitMut
1d20: 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e  ex mutex. Return
1d30: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74   an error in eit
1d40: 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  her case.  */.  
1d50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d70: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  rc;.  }..  /* Do
1d80: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1d90: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1da0: 75 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73  under the recurs
1db0: 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a  ive mutex so.  *
1dc0: 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  * that we will b
1dd0: 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e able to handle
1de0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1df0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1e00: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
1e10: 20 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20    The recursive 
1e20: 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  calls normally c
1e30: 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a  ome through.  **
1e40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1e50: 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b  () when it invok
1e60: 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  es sqlite3_vfs_r
1e70: 65 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f  egister(), but o
1e80: 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73  ther.  ** recurs
1e90: 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20  ive calls might 
1ea0: 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65  also be possible
1eb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c  ..  **.  ** IMPL
1ec0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
1ed0: 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c  -00140-37445 SQL
1ee0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
1ef0: 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c  y serializes cal
1f00: 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  ls.  ** to the x
1f10: 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20  Init method, so 
1f20: 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64  the xInit method
1f30: 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72   need not be thr
1f40: 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20  eadsafe..  **.  
1f50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1f60: 20 6d 75 74 65 78 20 69 73 20 77 68 61 74 20 73   mutex is what s
1f70: 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73  erializes access
1f80: 20 74 6f 20 74 68 65 20 61 70 70 64 65 66 20 70   to the appdef p
1f90: 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a  cache xInit.  **
1fa0: 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73   methods.  The s
1fb0: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
1fc0: 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c  thods.xInit() al
1fd0: 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e  l is embedded in
1fe0: 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74   the.  ** call t
1ff0: 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49  o sqlite3PcacheI
2000: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a  nitialize()..  *
2010: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2020: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
2030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2040: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
2070: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2080: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
2090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
20a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
20b0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66  rogress = 1;.#if
20c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20d0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20  E_SQLLOG.    {. 
20e0: 20 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64       extern void
20f0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
2100: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
2110: 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73    sqlite3_init_s
2120: 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23  qllog();.    }.#
2130: 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74  endif.    memset
2140: 28 26 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e  (&sqlite3Builtin
2150: 46 75 6e 63 74 69 6f 6e 73 2c 20 30 2c 20 73 69  Functions, 0, si
2160: 7a 65 6f 66 28 73 71 6c 69 74 65 33 42 75 69 6c  zeof(sqlite3Buil
2170: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a  tinFunctions));.
2180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73      sqlite3Regis
2190: 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
21a0: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
21b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
21c0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
21d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
21e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
21f0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
2200: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2220: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2230: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2240: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2250: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2260: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
2270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
2280: 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 69 66  SERIALIZE.    if
2290: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22b0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 29  lite3MemdbInit()
22c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
22d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22f0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
2300: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
2310: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
2320: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
2330: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2340: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
2350: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
2360: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64  isInit = 1;.#ifd
2390: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
23a0: 49 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45  INIT.      bRunE
23b0: 78 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65  xtraInit = 1;.#e
23c0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73  ndif.    }.    s
23d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23e0: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
23f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
2400: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20  .pInitMutex);.. 
2430: 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65   /* Go back unde
2440: 72 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74  r the static mut
2450: 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20  ex and clean up 
2460: 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20  the recursive.  
2470: 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76  ** mutex to prev
2480: 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c  ent a resource l
2490: 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  eak..  */.  sqli
24a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
24b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
24c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24d0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b  nRefInitMutex--;
24e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
2500: 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20  nitMutex<=0 ){. 
2510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2520: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2530: 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20  RefInitMutex==0 
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
2550: 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65  utex_free(sqlite
2560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
2570: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73  nitMutex);.    s
2580: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2590: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20  ig.pInitMutex = 
25a0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
25b0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
25c0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ster);..  /* The
25d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75   following is ju
25e0: 73 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  st a sanity chec
25f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53  k to make sure S
2600: 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62  QLite has.  ** b
2610: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72  een compiled cor
2620: 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69  rectly.  It is i
2630: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20  mportant to run 
2640: 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20  this code, but. 
2650: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
2660: 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20  t to run it too 
2670: 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75  often and soak u
2680: 70 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72  p CPU cycles for
2690: 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   no.  ** reason.
26a0: 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f    So we run it o
26b0: 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69  nce during initi
26c0: 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  alization..  */.
26d0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
26e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
2700: 54 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74  T.  /* This sect
2710: 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e  ion of code's on
2720: 6c 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76  ly "output" is v
2730: 69 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ia assert() stat
2740: 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 28  ements. */.  if(
2750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2760: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2770: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2780: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2790: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
27a0: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
27b0: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
27c0: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
27d0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
27e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
27f0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2800: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2810: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2820: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2830: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2840: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2850: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2860: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2870: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2880: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2890: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
28a0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
28b0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
28c0: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
28d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28e0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
28f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2900: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2910: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2920: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2930: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2940: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2950: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2960: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2970: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2980: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2990: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
29a0: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
29b0: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
29c0: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
29d0: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
29e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
29f0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2a00: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2a10: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2a20: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2a30: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2a40: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2a50: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2a60: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2a70: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a80: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2a90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2aa0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2ab0: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2ac0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2ad0: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2ae0: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2af0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2b00: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2b10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2b20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2b30: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2b40: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2b50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2b60: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2b70: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2b80: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2b90: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2ba0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2bb0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2bc0: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2be0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2bf0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2c00: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2c10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c20: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2c30: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2c40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2c50: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2c60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2c70: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c90: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2ca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2cb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2cc0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2ce0: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2cf0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d00: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2d10: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2d20: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2d30: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2d40: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2d50: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2d60: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2d70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2d80: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2d90: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2da0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2db0: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2dc0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2dd0: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2de0: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2df0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2e00: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2e10: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2e20: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2e30: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2e40: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2e50: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2e60: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2e70: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2e80: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2e90: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2ea0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2eb0: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2ec0: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2ed0: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2ee0: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2ef0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2f00: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2f10: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2f20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2f30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2f40: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2f50: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2f60: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2f70: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2f80: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2f90: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2fa0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2fb0: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2fc0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2fd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ff0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
3000: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
3010: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
3020: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
3030: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3040: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
3050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3060: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
3070: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
3080: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
3090: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
30a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
30b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
30c0: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
30d0: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
30e0: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
30f0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
3100: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
3110: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
3120: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
3130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3140: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3150: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3170: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3180: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3190: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
31a0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
31b0: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
31c0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
31d0: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
31e0: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
31f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3200: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
3210: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
3220: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
3230: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3240: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3250: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3260: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3270: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3280: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3290: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
32a0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
32b0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
32c0: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
32d0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
32e0: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
32f0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
3300: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3310: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
3320: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3330: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
3340: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3350: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3360: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3370: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3380: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33a0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
33b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
33c0: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
33d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33e0: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
33f0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3400: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
3410: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
3420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3430: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3440: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3460: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3470: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3490: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
34a0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
34b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
34c0: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
34d0: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
34e0: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
34f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
3500: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
3510: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3520: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3530: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3540: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3550: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3570: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3580: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3590: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
35a0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
35b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
35c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
35d0: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
35e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
35f0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
3600: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
3610: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3620: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
3630: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3640: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3650: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3660: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3670: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3680: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3690: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
36b0: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
36c0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
36d0: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
36e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
36f0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
3700: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3710: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3720: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3740: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3750: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3760: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3770: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3780: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3790: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
37a0: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
37b0: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
37c0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
37d0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
37e0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
37f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3800: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
3810: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
3820: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
3830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3850: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3860: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3870: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3880: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3890: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
38a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
38b0: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
38c0: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
38d0: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
38e0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
38f0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3900: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
3910: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
3920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
3940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3950: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3960: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3970: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3980: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3990: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
39a0: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
39b0: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
39c0: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
39d0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
39e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
39f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a00: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3a10: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3a20: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
3a30: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
3a40: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3a50: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3a60: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3a70: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3a80: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3a90: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3aa0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3ab0: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3ac0: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3ae0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
3af0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3b00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
3b40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3b50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3b60: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3b70: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3b80: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3b90: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3ba0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3bb0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3bc0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3bd0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3be0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3bf0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3c00: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3c10: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3c20: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3c30: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3c40: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3c50: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3c60: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3c70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3c90: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3ca0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3cb0: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3cc0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3cd0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cf0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3d20: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3d30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3d40: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3d50: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3d60: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3d70: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3d80: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3d90: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3da0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3db0: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3dc0: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3dd0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3de0: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3e00: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3e10: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e20: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3e30: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3e40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3e70: 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  MALL_MALLOC: {. 
3e80: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e90: 61 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d  alConfig.bSmallM
3ea0: 61 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61  alloc = va_arg(a
3eb0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ef0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3f00: 45 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36  E-OF: R-18761-36
3f10: 36 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68  601 There are th
3f20: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f30: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f40: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f50: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f60: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f70: 65 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20  emory (pMem),.  
3f80: 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20      ** the size 
3f90: 6f 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63  of each page cac
3fa0: 68 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e  he line (sz), an
3fb0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
3fc0: 63 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20  cache lines.    
3fd0: 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20    ** (N). */.   
3fe0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3ff0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
4000: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4020: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
4030: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
4040: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4050: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4060: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
4070: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4080: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40a0: 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a  IG_PCACHE_HDRSZ:
40b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
40c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30  ENCE-OF: R-39100
40d0: 2d 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54  -27317 The SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
40f0: 48 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b  HDRSZ option tak
4100: 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  es.      ** a si
4110: 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77  ngle parameter w
4120: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4130: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
4140: 61 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a  and writes into.
4150: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e        ** that in
4160: 74 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72  teger the number
4170: 20 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20   of extra bytes 
4180: 70 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65  per page require
4190: 64 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a  d for each page.
41a0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49        ** in SQLI
41b0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
41c0: 43 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76  CHE. */.      *v
41d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20  a_arg(ap, int*) 
41e0: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  = .          sql
41f0: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74  ite3HeaderSizeBt
4200: 72 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20  ree() +.        
4210: 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53    sqlite3HeaderS
4220: 69 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20  izePcache() +.  
4230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4240: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31  eaderSizePcache1
4250: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
4260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4270: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4280: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4290: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
42b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42c0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61  {.      /* now a
42e0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
42f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
4300: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
4320: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4330: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4340: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4350: 52 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68  R-63325-48378 Th
4360: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4370: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4380: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4390: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
43a0: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
43b0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
43c0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
43d0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
43e0: 2e 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70  . This object sp
43f0: 65 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65  ecifies the inte
4400: 72 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f  rface to a custo
4410: 6d 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20  m page cache.   
4420: 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
4430: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73  tion. */.      s
4440: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4450: 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61  ig.pcache2 = *va
4460: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4470: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4480: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
44a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
44b0: 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20  TPCACHE2: {.    
44c0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
44d0: 3a 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20  : R-22035-46182 
44e0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
44f0: 47 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74  G_GETPCACHE2 opt
4500: 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20  ion takes a.    
4510: 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75    ** single argu
4520: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20  ment which is a 
4530: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
4540: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
4550: 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f  hods2.      ** o
4560: 62 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f  bject. SQLite co
4570: 70 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72  pies of the curr
4580: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69  ent page cache i
4590: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
45a0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  to.      ** that
45b0: 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
45c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
45d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
45e0: 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  2.xInit==0 ){.  
45f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
4600: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
4620: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4630: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
4640: 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  s2*) = sqlite3Gl
4650: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
4660: 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e2;.      break;
4670: 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45  .    }../* EVIDE
4680: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d  NCE-OF: R-06626-
4690: 31 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45  12911 The SQLITE
46a0: 5f 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74  _CONFIG_HEAP opt
46b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61  ion is only.** a
46c0: 76 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69  vailable if SQLi
46d0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  te is compiled w
46e0: 69 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54  ith either SQLIT
46f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4700: 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e   or.** SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64  ABLE_MEMSYS5 and
4720: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
4730: 45 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64  ERROR if invoked
4740: 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23   otherwise. */.#
4750: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4760: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4770: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4790: 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S5).    case SQL
47a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
47b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
47c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34  ENCE-OF: R-19854
47d0: 2d 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65  -42126 There are
47e0: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
47f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
4800: 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a  ITE_CONFIG_HEAP:
4810: 20 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   An 8-byte align
4820: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4830: 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20  e memory, the.  
4840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
4850: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65   bytes in the me
4860: 6d 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64  mory buffer, and
4870: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
4880: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20  ocation size..  
4890: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
48a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
48b0: 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .pHeap = va_arg(
48c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
48d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
48e0: 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61  onfig.nHeap = va
48f0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4910: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4920: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4930: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ;..      if( sql
4940: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4950: 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20  .mnReq<1 ){.    
4960: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4970: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4980: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
4990: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c  Config.mnReq>(1<
49b0: 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  <12) ){.        
49c0: 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65  /* cap min reque
49d0: 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20  st size at 2^12 
49e0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
49f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4a00: 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a  nReq = (1<<12);.
4a10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
4a20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4a30: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
4a50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39  IDENCE-OF: R-499
4a60: 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20  20-60189 If the 
4a70: 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74  first pointer (t
4a80: 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  he memory pointe
4a90: 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  r).        ** is
4aa0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69   NULL, then SQLi
4ab0: 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73  te reverts to us
4ac0: 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20  ing its default 
4ad0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65  .        ** (the
4af0: 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29   system malloc()
4b00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
4b10: 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72  , undoing any pr
4b20: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f  ior invocation o
4b30: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c  f.        ** SQL
4b40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
4b50: 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  C..        **.  
4b60: 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67        ** Setting
4b70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4b80: 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65  nfig.m to all ze
4b90: 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d  ros will cause m
4ba0: 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20  alloc to.       
4bb0: 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74   ** revert to it
4bc0: 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d  s default implem
4bd0: 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71  entation when sq
4be0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
4bf0: 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20  () is run.      
4c00: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
4c10: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
4c20: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
4c30: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
4c40: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
4c50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4c60: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c70: 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31  OF: R-61006-0891
4c80: 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  8 If the memory 
4c90: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
4ca0: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ULL then the.   
4cb0: 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74       ** alternat
4cc0: 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ive memory alloc
4cd0: 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20  ator is engaged 
4ce0: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66  to handle all of
4cf0: 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20   SQLites.       
4d00: 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
4d10: 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a  ation needs. */.
4d20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4d30: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
4d40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4d50: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
4d60: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4d70: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4d90: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
4da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4db0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
4dc0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
4dd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
4de0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4df0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4e00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4e10: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
4e20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4e30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
4e40: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
4e50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e70: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
4e80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4e90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ea0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
4eb0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
4ec0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
4ed0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  function and its
4ee0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4ef0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
4f00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
4f10: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
4f20: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
4f30: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
4f40: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
4f50: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f60: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
4f70: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
4f80: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
4f90: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
4fa0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
4fb0: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
4fc0: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
4fd0: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
4fe0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
4ff0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
5000: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
5010: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
5020: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
5030: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
5040: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
5050: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
5060: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
5070: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5080: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
5090: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
50a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
50c0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
50d0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
50e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
50f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5100: 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37  F: R-55548-33817
5110: 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   The compile-tim
5120: 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52  e setting for UR
5130: 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  I filenames.    
5140: 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
5150: 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20  d at start-time 
5160: 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  using the.    **
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
5180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5190: 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  I,1) or.    ** s
51a0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51c0: 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  0) configuration
51d0: 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   calls..    */. 
51e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
51f0: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
5200: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5210: 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35  F: R-25451-61125
5220: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
5230: 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61  IG_URI option ta
5240: 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20  kes a single.   
5250: 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f     ** argument o
5260: 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e  f type int. If n
5270: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  on-zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20  enabled. If the 
52b0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
52c0: 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64  o, then URI hand
52d0: 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79  ling is globally
52e0: 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
52f0: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
5300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5310: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
5320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5340: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5350: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
5360: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
5370: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5380: 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37  -OF: R-36592-027
5390: 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  72 The SQLITE_CO
53a0: 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e  NFIG_COVERING_IN
53b0: 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a  DEX_SCAN.      *
53c0: 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  * option takes a
53d0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
53e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
53f0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
5400: 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c   a.      ** bool
5410: 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ean in order to 
5420: 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  enable or disabl
5430: 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76  e the use of cov
5440: 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f  ering indices fo
5450: 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20  r.      ** full 
5460: 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74  table scans in t
5470: 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  he query optimiz
5480: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
5490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
54a0: 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72  .bUseCis = va_ar
54b0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
54c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
54d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
54e0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
54f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5500: 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20  IG_SQLLOG: {.   
5510: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
5520: 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76  *SQLLOGFUNC_t)(v
5530: 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  oid*, sqlite3*, 
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
5550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5560: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
5570: 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  llog = va_arg(ap
5580: 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b  , SQLLOGFUNC_t);
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
55b0: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
55c0: 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20  p, void *);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
55e0: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
55f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
5600: 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
5610: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5620: 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53   R-58063-38258 S
5630: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5640: 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f  P_SIZE takes two
5650: 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   64-bit.      **
5660: 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65   integer (sqlite
5670: 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20  3_int64) values 
5680: 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66  that are the def
5690: 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c  ault mmap size l
56a0: 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  imit.      ** (t
56b0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
56c0: 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d  ng for PRAGMA mm
56d0: 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65  ap_size) and the
56e0: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
56f0: 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73  .      ** mmap s
5700: 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20  ize limit. */.  
5710: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
5720: 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 szMmap = va_ar
5730: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
5740: 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t64);.      sqli
5750: 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70  te3_int64 mxMmap
5760: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
5770: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
5780: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5790: 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39  OF: R-53367-4319
57a0: 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75  0 If either argu
57b0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74  ment to this opt
57c0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
57d0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
57e0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  hat argument is 
57f0: 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63  changed to its c
5800: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61  ompile-time defa
5810: 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ult..      **.  
5820: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5830: 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33  OF: R-34993-4503
5840: 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  1 The maximum al
5850: 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20  lowed mmap size 
5860: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
5870: 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61   silently trunca
5880: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
5890: 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73   so that it does
58a0: 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a   not exceed the.
58b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65        ** compile
58c0: 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d  -time maximum mm
58d0: 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74  ap size set by t
58e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  he SQLITE_MAX_MM
58f0: 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a  AP_SIZE.      **
5900: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
5910: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
5920: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
5930: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
5940: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
5960: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
5970: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5980: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
5990: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
59a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
59b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
59c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
59d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
59e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
59f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5a00: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
5a30: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5a60: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5a70: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5a80: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5a90: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5aa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5ac0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5ad0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5ae0: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5af0: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b00: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5b10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
5b20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
5b30: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
5b40: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
5b50: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
5b60: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
5b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5b90: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5ba0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5bc0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5bd0: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5be0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5bf0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5c00: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5c10: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
5c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5c30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5c40: 45 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e  E_CONFIG_STMTJRN
5c50: 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20  L_SPILL: {.     
5c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c70: 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20  nfig.nStmtSpill 
5c80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5cc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
5cd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5ce0: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
5cf0: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  IZE: {.      int
5d00: 20 69 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   iVal = va_arg(a
5d10: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
5d20: 66 28 20 69 56 61 6c 3c 30 20 29 7b 0a 20 20 20  f( iVal<0 ){.   
5d30: 20 20 20 20 20 69 56 61 6c 20 3d 20 53 51 4c 49       iVal = SQLI
5d40: 54 45 5f 44 45 46 41 55 4c 54 5f 53 4f 52 54 45  TE_DEFAULT_SORTE
5d50: 52 52 45 46 5f 53 49 5a 45 3b 0a 20 20 20 20 20  RREF_SIZE;.     
5d60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5d70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
5d80: 6f 72 74 65 72 52 65 66 20 3d 20 28 75 33 32 29  orterRef = (u32)
5d90: 69 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  iVal;.      brea
5da0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5db0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
5dc0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
5dd0: 45 53 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75  ES */..    defau
5de0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
5df0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e10: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
5e20: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
5e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
5e40: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
5e50: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
5e60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5e70: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
5e80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
5e90: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
5ea0: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
5eb0: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
5ec0: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
5ed0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
5ee0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5ef0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
5f00: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
5f10: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
5f20: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5f30: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
5f40: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
5f50: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
5f60: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
5f70: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
5f80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
5f90: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
5fa0: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
5fb0: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
5fc0: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
5fd0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
5fe0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
5ff0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6000: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
6010: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
6020: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
6030: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
6040: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6050: 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20  OMIT_LOOKASIDE. 
6060: 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20   void *pStart;. 
6070: 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c   .  if( sqlite3L
6080: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
6090: 30 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  0)>0 ){.    retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
60b0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
60c0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
60d0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
60e0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
60f0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
6100: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
6110: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
6120: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
6130: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
6140: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
6150: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
6160: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6180: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
6190: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
61a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
61b0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
61c0: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
61d0: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
61e0: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
61f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
6200: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
6210: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
6220: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
6230: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
6240: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
6250: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6260: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
6270: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
6280: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
6290: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
62a0: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
62b0: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
62c0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
62d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
62e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
62f0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
6300: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
6310: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
6320: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
6330: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
6340: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
6350: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
6360: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
6370: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
6380: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
6390: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
63a0: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
63b0: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
63c0: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
63d0: 69 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20  ide.pInit = 0;. 
63e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
63f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
6400: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
6410: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
6420: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
6430: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
6440: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
6450: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
6460: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
6470: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d  lot*) );.    db-
6480: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74  >lookaside.nSlot
6490: 20 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20   = cnt;.    p = 
64a0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
64b0: 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28  pStart;.    for(
64c0: 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69  i=cnt-1; i>=0; i
64d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  --){.      p->pN
64e0: 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ext = db->lookas
64f0: 69 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20  ide.pInit;.     
6500: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6510: 49 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Init = p;.      
6520: 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  p = (LookasideSl
6530: 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a  ot*)&((u8*)p)[sz
6540: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
6550: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
6560: 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = p;.    db->loo
6570: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
6580: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6590: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
65a0: 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b   = pBuf==0 ?1:0;
65b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
65c0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
65d0: 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  rt = db;.    db-
65e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
65f0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6600: 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
6610: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
6620: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6630: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
6640: 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d  ookaside.nSlot =
6650: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6660: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6670: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
66a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
66b0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
66c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
66d0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
66e0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
66f0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6710: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6720: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6730: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6740: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6750: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6760: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6770: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6780: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6790: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
67a0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
67b0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
67c0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
67d0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
67e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
67f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6810: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6830: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6840: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6850: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6870: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6880: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6890: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
68a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
68b0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
68c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
68d0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
68e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
68f0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6900: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6910: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6920: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6940: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6950: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6960: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6970: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6980: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6990: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
69a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
69c0: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
69d0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
69e0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
69f0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6a00: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6a10: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6a20: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6a30: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6a40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6a50: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6a60: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6a70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6a80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6a90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6aa0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6ab0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6ac0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6ad0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6ae0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6af0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6b00: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6b10: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6b20: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6b30: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6b40: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6b50: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6b60: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6b70: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6b80: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6b90: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6ba0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6bb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6bc0: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6bd0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6bf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6c00: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6c10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6c20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6c30: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6c40: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6c60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6c70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6c90: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ca0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6cc0: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6cd0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6ce0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6cf0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6d00: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6d10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6d20: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6d30: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6d40: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6d50: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6d60: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6d70: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6d80: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6d90: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36      /* IMP: R-06
6da0: 38 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20  824-28531 */.   
6db0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32     /* IMP: R-362
6dc0: 35 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20  57-52125 */.    
6dd0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62    db->aDb[0].zDb
6de0: 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  SName = va_arg(a
6df0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  p,char*);.      
6e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
6e30: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
6e40: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
6e50: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
6e60: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
6e70: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
6e80: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
6e90: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
6ea0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
6eb0: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
6ec0: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
6ed0: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
6ee0: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
6ef0: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
6f00: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
6f10: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
6f20: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
6f30: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
6f40: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6f50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
6f60: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
6f70: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
6f80: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
6f90: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
6fa0: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
6fb0: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
6fc0: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
6fd0: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
6fe0: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
6ff0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
7000: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7010: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
7020: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46          SQLITE_F
7030: 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c  oreignKeys    },
7040: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
7050: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
7060: 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20  E_TRIGGER,      
7070: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
7080: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
7090: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
70a0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
70b0: 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49  _TOKENIZER, SQLI
70c0: 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72  TE_Fts3Tokenizer
70d0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
70e0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
70f0: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
7100: 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61  SION, SQLITE_Loa
7110: 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20  dExtension  },. 
7120: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
7130: 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54  DBCONFIG_NO_CKPT
7140: 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20  _ON_CLOSE,      
7150: 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
7160: 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20  lose  },.       
7170: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
7180: 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20  IG_ENABLE_QPSG, 
7190: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
71a0: 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20  _EnableQPSG     
71b0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
71c0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
71d0: 47 47 45 52 5f 45 51 50 2c 20 20 20 20 20 20 20  GGER_EQP,       
71e0: 20 20 20 20 53 51 4c 49 54 45 5f 54 72 69 67 67      SQLITE_Trigg
71f0: 65 72 45 51 50 20 20 20 20 20 7d 2c 0a 20 20 20  erEQP     },.   
7200: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7210: 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
7220: 41 42 41 53 45 2c 20 20 20 20 20 20 20 20 53 51  ABASE,        SQ
7230: 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
7240: 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  se  },.        {
7250: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7260: 5f 44 45 46 45 4e 53 49 56 45 2c 20 20 20 20 20  _DEFENSIVE,     
7270: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
7280: 65 66 65 6e 73 69 76 65 20 20 20 20 20 20 7d 2c  efensive      },
7290: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
72a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
72b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
72c0: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
72d0: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
72e0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
72f0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
7300: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
7310: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
7320: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
7330: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
7340: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
7350: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
7360: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
7370: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
7380: 20 20 20 20 20 20 20 75 36 34 20 6f 6c 64 46 6c         u64 oldFl
7390: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
73a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
73b0: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
73c0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
73d0: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
73e0: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
73f0: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
7400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7410: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46  db->flags &= ~aF
7420: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
7430: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7440: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
7450: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
7460: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
7470: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
7480: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20  dStatements(db, 
7490: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
74a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
74b0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
74c0: 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66    *pRes = (db->f
74d0: 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69  lags & aFlagOp[i
74e0: 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20  ].mask)!=0;.    
74f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7500: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
7510: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7520: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7530: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
7550: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
7560: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
7570: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
7580: 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e  the buffer z[0..
7590: 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c  n-1] contains al
75a0: 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  l spaces..*/.sta
75b0: 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65  tic int allSpace
75c0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  s(const char *z,
75d0: 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65   int n){.  while
75e0: 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>0 && z[n-1]=
75f0: 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  =' ' ){ n--; }. 
7600: 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a   return n==0;.}.
7610: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
7620: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
7630: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61  ting function na
7640: 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69  med "BINARY" whi
7650: 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  ch is always.** 
7660: 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
7670: 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20   If the padFlag 
7680: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
7690: 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20  NULL then space 
76a0: 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65  padding at the e
76b0: 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73  nd.** of strings
76c0: 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   is ignored.  Th
76d0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  is implements th
76e0: 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f  e RTRIM collatio
76f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
7700: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20   binCollFunc(.  
7710: 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20  void *padFlag,. 
7720: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
7730: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
7740: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
7750: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
7760: 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
7770: 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
7780: 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
7790: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
77a0: 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39  F: R-65033-28449
77b0: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49   The built-in BI
77c0: 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  NARY collation c
77d0: 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72  ompares.  ** str
77e0: 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74  ings byte by byt
77f0: 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63  e using the memc
7800: 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72  mp() function fr
7810: 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
7820: 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20  C.  ** library. 
7830: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  */.  assert( pKe
7840: 79 31 20 26 26 20 70 4b 65 79 32 20 29 3b 0a 20  y1 && pKey2 );. 
7850: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
7860: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
7870: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
7880: 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20    if( padFlag.  
7890: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
78a0: 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e  ((char*)pKey1)+n
78b0: 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20  , nKey1-n).     
78c0: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
78d0: 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e  har*)pKey2)+n, n
78e0: 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20  Key2-n).    ){. 
78f0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
7900: 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37  -OF: R-31624-247
7910: 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65  37 RTRIM is like
7920: 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20 74   BINARY except t
7930: 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20 20  hat extra.      
7940: 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68 65  ** spaces at the
7950: 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73   end of either s
7960: 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61  tring do not cha
7970: 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20  nge the result. 
7980: 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  In other.      *
7990: 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73  * words, strings
79a0: 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71   will compare eq
79b0: 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ual to one anoth
79c0: 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  er as long as th
79d0: 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66  ey.      ** diff
79e0: 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e  er only in the n
79f0: 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73 20  umber of spaces 
7a00: 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20  at the end..    
7a10: 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
7a20: 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31        rc = nKey1
7a30: 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a   - nKey2;.    }.
7a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7a60: 20 74 72 75 65 20 69 66 20 43 6f 6c 6c 53 65 71   true if CollSeq
7a70: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
7a80: 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 2e  built-in BINARY.
7a90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7aa0: 73 42 69 6e 61 72 79 28 63 6f 6e 73 74 20 43 6f  sBinary(const Co
7ab0: 6c 6c 53 65 71 20 2a 70 29 7b 0a 20 20 61 73 73  llSeq *p){.  ass
7ac0: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
7ad0: 78 43 6d 70 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e  xCmp!=binCollFun
7ae0: 63 20 7c 7c 20 70 2d 3e 70 55 73 65 72 21 3d 30  c || p->pUser!=0
7af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
7b00: 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c  strcmp(p->zName,
7b10: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 3b 0a  "BINARY")==0 );.
7b20: 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c 7c    return p==0 ||
7b30: 20 28 70 2d 3e 78 43 6d 70 3d 3d 62 69 6e 43 6f   (p->xCmp==binCo
7b40: 6c 6c 46 75 6e 63 20 26 26 20 70 2d 3e 70 55 73  llFunc && p->pUs
7b50: 65 72 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er==0);.}../*.**
7b60: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
7b70: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
7b80: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
7b90: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
7ba0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
7bb0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
7bc0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
7bd0: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
7be0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
7bf0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
7c00: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
7c10: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
7c20: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
7c30: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
7c40: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
7c50: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
7c60: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
7c70: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
7c80: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
7c90: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
7ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
7cb0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
7cc0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7cd0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7ce0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7cf0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
7d00: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7d10: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
7d20: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
7d30: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
7d40: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
7d50: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
7d60: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
7d70: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
7d80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
7d90: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
7da0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
7db0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
7dc0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7dd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7de0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7df0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7e00: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7e10: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7e20: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7e30: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7e40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7e50: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7e60: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7e70: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
7e80: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
7e90: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7ea0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
7eb0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
7ec0: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7ed0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 72   Set the value r
7ee0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
7ef0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7f00: 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66  rt_rowid() API f
7f10: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
7f20: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61 73   sqlite3_set_las
7f30: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
7f40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
7f50: 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
7f60: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7f70: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7f80: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7f90: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7fa0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7fb0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7fc0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
7fd0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
7fe0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7ff0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
8000: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  ->lastRowid = iR
8010: 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  owid;.  sqlite3_
8020: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8030: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mutex);.}../*.**
8040: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8050: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
8060: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8070: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8080: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
8090: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
80a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
80b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
80c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
80d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
80e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
80f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
8100: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
8110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8120: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
8130: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
8140: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8150: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
8160: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
8170: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
8180: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
8190: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
81a0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
81b0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
81c0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
81d0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
81e0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
81f0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
8200: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
8210: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
8220: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
8230: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
8240: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
8250: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
8260: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
8270: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
8280: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
8290: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
82a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
82b0: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
82c0: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
82d0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
82e0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
82f0: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
8300: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
8310: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
8320: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
8330: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
8340: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
8350: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
8360: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
8370: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
8380: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
8390: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
83a0: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
83b0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
83c0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
83d0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
83e0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
83f0: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
8400: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
8410: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
8420: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
8430: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
8440: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
8450: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
8460: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
8470: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
8480: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
8490: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
84a0: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
84b0: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
84c0: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
84d0: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
84e0: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
84f0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
8500: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
8510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8520: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
8530: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
8540: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
8550: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
8560: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75 2e  structor = p->u.
8570: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
8580: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
8590: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
85a0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
85b0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
85c0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
85d0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
85e0: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
85f0: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
8600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8610: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
8620: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
8630: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e  }../*.** Disconn
8640: 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ect all sqlite3_
8650: 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61  vtab objects tha
8660: 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61  t belong to data
8670: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
8680: 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63  ** db. This is c
8690: 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73  alled when db is
86a0: 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a   being closed..*
86b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
86c0: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
86d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
86e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8700: 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c   int i;.  HashEl
8710: 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  em *p;.  sqlite3
8720: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
8730: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
8740: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
8750: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
8760: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
8770: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
8780: 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   pSchema ){.    
8790: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
87a0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
87b0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70  ->tblHash); p; p
87c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
87d0: 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  p)){.        Tab
87e0: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
87f0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8800: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ta(p);.        i
8810: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8820: 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  b) ) sqlite3Vtab
8830: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
8840: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
8850: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d    }.  }.  for(p=
8860: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8870: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70  &db->aModule); p
8880: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
8890: 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(p)){.    Modu
88a0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
88b0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
88c0: 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ata(p);.    if( 
88d0: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b  pMod->pEpoTab ){
88e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
88f0: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
8900: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b   pMod->pEpoTab);
8910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8920: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
8930: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
8940: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
8950: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
8960: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
8970: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
8980: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
8990: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
89a0: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
89b0: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
89c0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
89d0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
89e0: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
89f0: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
8a00: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
8a10: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
8a20: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
8a30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8a40: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
8a50: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
8a60: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
8a70: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
8a80: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
8a90: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8aa0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
8ab0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
8ac0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
8ad0: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
8ae0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
8af0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8b00: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
8b10: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
8b20: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
8b30: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
8b40: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
8b50: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
8b60: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
8b70: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8b80: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
8b90: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
8ba0: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
8bb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
8bc0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
8bd0: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
8be0: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
8bf0: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
8c00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8c10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8c20: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
8c30: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
8c40: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
8c50: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
8c60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8c70: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8c80: 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26  if( db->mTrace &
8c90: 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c   SQLITE_TRACE_CL
8ca0: 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  OSE ){.    db->x
8cb0: 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41  Trace(SQLITE_TRA
8cc0: 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54  CE_CLOSE, db->pT
8cd0: 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b  raceArg, db, 0);
8ce0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65  .  }..  /* Force
8cf0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c   xDisconnect cal
8d00: 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61  ls on all virtua
8d10: 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69  l tables */.  di
8d20: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8d30: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  db);..  /* If a 
8d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
8d50: 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e  pen, the disconn
8d60: 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c  ectAllVtab() cal
8d70: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
8d80: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
8d90: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
8da0: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
8db0: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
8dc0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
8dd0: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
8de0: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
8df0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8e00: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
8e10: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
8e20: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
8e30: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
8e40: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
8e50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
8e60: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
8e70: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
8e80: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
8e90: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
8ea0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
8eb0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
8ec0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
8ed0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
8ee0: 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69  /* Legacy behavi
8ef0: 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or (sqlite3_clos
8f00: 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73  e() behavior) is
8f10: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
8f20: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74  SQLITE_BUSY if t
8f30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61  he connection ca
8f40: 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  n not be closed 
8f50: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
8f60: 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f  /.  if( !forceZo
8f70: 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69  mbie && connecti
8f80: 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a  onIsBusy(db) ){.
8f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8fa0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
8fb0: 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65  TE_BUSY, "unable
8fc0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
8fd0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20   unfinalized ". 
8fe0: 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74        "statement
8ff0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
9000: 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73  backups");.    s
9010: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9020: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9040: 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64  _BUSY;.  }..#ifd
9050: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9060: 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
9070: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9080: 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
9090: 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20   /* Closing the 
90a0: 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
90b0: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
90c0: 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20  ed the value 2. 
90d0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  */.    sqlite3Gl
90e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
90f0: 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  og(sqlite3Global
9100: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
9110: 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20  g, db, 0, 2);.  
9120: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
9130: 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65  onvert the conne
9140: 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d  ction into a zom
9150: 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f  bie and then clo
9160: 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62  se it..  */.  db
9170: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
9180: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20  _MAGIC_ZOMBIE;. 
9190: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
91a0: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
91b0: 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (db);.  return S
91c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
91d0: 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e  ** Two variation
91e0: 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20  s on the public 
91f0: 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c  interface for cl
9200: 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  osing a database
9210: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  .** connection. 
9220: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
9230: 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75  e() version retu
9240: 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20  rns SQLITE_BUSY 
9250: 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68  and.** leaves th
9260: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74  e connection opt
9270: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
9280: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
9290: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
92a0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
92b0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
92c0: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
92d0: 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65  close_v2().** ve
92e0: 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65  rsion forces the
92f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
9300: 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69  ecome a zombie i
9310: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75  f there are.** u
9320: 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65  nclosed resource
9330: 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20  s, and arranges 
9340: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  for deallocation
9350: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a   when the last.*
9360: 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d  * prepare statem
9370: 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  ent or sqlite3_b
9380: 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f  ackup closes..*/
9390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
93a0: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  se(sqlite3 *db){
93b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
93c0: 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e  lose(db,0); }.in
93d0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  t sqlite3_close_
93e0: 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  v2(sqlite3 *db){
93f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43   return sqlite3C
9400: 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a  lose(db,1); }...
9410: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
9420: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
9430: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  e connection db.
9440: 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f  .**.** Furthermo
9450: 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65 20  re, if database 
9460: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
9470: 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69   a zombie (meani
9480: 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a  ng that there.**
9490: 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f   has been a prio
94a0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
94b0: 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73  3_close(db) or s
94c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
94d0: 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72  db)) and.** ever
94e0: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68  y sqlite3_stmt h
94f0: 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61  as now been fina
9500: 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20  lized and every 
9510: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68  sqlite3_backup h
9520: 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20  as.** finished, 
9530: 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65  then free all re
9540: 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  sources..*/.void
9550: 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74   sqlite3LeaveMut
9560: 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65  exAndCloseZombie
9570: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9580: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20   HashElem *i;   
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69   /* Hash table i
95b0: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
95c0: 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   j;..  /* If the
95d0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
95e0: 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ng sqlite3_stmt 
95f0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
9600: 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f  p objects.  ** o
9610: 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  r if the connect
9620: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
9630: 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73  been closed by s
9640: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
9650: 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73  ),.  ** then jus
9660: 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65  t leave the mute
9670: 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  x and return..  
9680: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67  */.  if( db->mag
9690: 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic!=SQLITE_MAGIC
96a0: 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65  _ZOMBIE || conne
96b0: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
96c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
96d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
96e0: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
96f0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
9700: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
9710: 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
9720: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
9730: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20  connection has. 
9740: 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73   ** closed all s
9750: 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20  qlite3_stmt and 
9760: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
9770: 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20 62  bjects and has b
9780: 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20  een.  ** passed 
9790: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
97a0: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69   (meaning that i
97b0: 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20  t is a zombie). 
97c0: 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a   Therefore,.  **
97d0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72   go ahead and fr
97e0: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
97f0: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ..  */..  /* If 
9800: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9810: 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62   open, roll it b
9820: 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65  ack. This also e
9830: 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a 20  nsures that if. 
9840: 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65   ** any database
9850: 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62 65   schemas have be
9860: 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61  en modified by a
9870: 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72  n uncommitted tr
9880: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74  ansaction.  ** t
9890: 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20 41  hey are reset. A
98a0: 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71 75  nd that the requ
98b0: 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ired b-tree mute
98c0: 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b  x is held to mak
98d0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  e.  ** the pager
98e0: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
98f0: 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74  hema reset an at
9900: 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20  omic operation. 
9910: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c  */.  sqlite3Roll
9920: 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
9930: 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72  TE_OK);..  /* Fr
9940: 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  ee any outstandi
9950: 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72  ng Savepoint str
9960: 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71  uctures. */.  sq
9970: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
9980: 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ints(db);..  /* 
9990: 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61  Close all databa
99a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  se connections *
99b0: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  /.  for(j=0; j<d
99c0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
99d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
99e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
99f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
9a00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9a10: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
9a20: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
9a30: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
9a40: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
9a50: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
9a60: 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
9a70: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c     }.  }.  /* Cl
9a80: 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63 68  ear the TEMP sch
9a90: 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20 61  ema separately a
9aa0: 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28  nd last */.  if(
9ab0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
9ac0: 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ema ){.    sqlit
9ad0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
9ae0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
9af0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9b00: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
9b10: 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75  b);..  /* Free u
9b20: 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61  p the array of a
9b30: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
9b40: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  es */.  sqlite3C
9b50: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
9b60: 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65  rray(db);.  asse
9b70: 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29  rt( db->nDb<=2 )
9b80: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
9b90: 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb==db->aDbStat
9ba0: 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c  ic );..  /* Tell
9bb0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74   the code in not
9bc0: 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63  ify.c that the c
9bd0: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e  onnection no lon
9be0: 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20  ger holds any.  
9bf0: 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65  ** locks and doe
9c00: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
9c10: 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b  y further unlock
9c20: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
9c30: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
9c40: 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65  3ConnectionClose
9c50: 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  d(db);..  for(i=
9c60: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
9c70: 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20  &db->aFunc); i; 
9c80: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
9c90: 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  (i)){.    FuncDe
9ca0: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20  f *pNext, *p;.  
9cb0: 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68    p = sqliteHash
9cc0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b  Data(i);.    do{
9cd0: 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44  .      functionD
9ce0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
9cf0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
9d00: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
9d10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d20: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65  );.      p = pNe
9d30: 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  xt;.    }while( 
9d40: 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p );.  }.  sqlit
9d50: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9d60: 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69  >aFunc);.  for(i
9d70: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9d80: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
9d90: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
9da0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
9db0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
9dc0: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
9dd0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
9de0: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
9df0: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
9e00: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
9e10: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
9e20: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
9e30: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
9e40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
9e50: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
9e60: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
9e70: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
9e80: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
9e90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
9ea0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
9eb0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
9ec0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
9ed0: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
9ee0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9ef0: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
9f00: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9f10: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
9f20: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
9f30: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
9f40: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
9f50: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
9f60: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
9f70: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20   pMod->xDestroy 
9f80: 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78  ){.      pMod->x
9f90: 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41  Destroy(pMod->pA
9fa0: 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ux);.    }.    s
9fb0: 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d  qlite3VtabEponym
9fc0: 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62  ousTableClear(db
9fd0: 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c  , pMod);.    sql
9fe0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9ff0: 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Mod);.  }.  sqli
a000: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
a010: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
a020: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
a030: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
a040: 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  ); /* Deallocate
a050: 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72  s any cached err
a060: 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20  or strings. */. 
a070: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
a080: 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73  e(db->pErr);.  s
a090: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
a0a0: 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53  sions(db);.#if S
a0b0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
a0c0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69  NTICATION.  sqli
a0d0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
a0e0: 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20  h.zAuthUser);.  
a0f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
a100: 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a  >auth.zAuthPW);.
a110: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61  #endif..  db->ma
a120: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
a130: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
a140: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
a150: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
a160: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
a170: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
a180: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
a190: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
a1a0: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
a1b0: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
a1c0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
a1d0: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
a1e0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
a1f0: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
a200: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
a210: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
a220: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
a230: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
a240: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
a250: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
a260: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
a270: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
a280: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a290: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
a2a0: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
a2b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
a2c0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
a2d0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
a2e0: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
a2f0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
a300: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
a310: 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f 6b  ert( sqlite3Look
a320: 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29 3d  asideUsed(db,0)=
a330: 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  =0 );.  if( db->
a340: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
a350: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
a360: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
a370: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
a380: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
a390: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
a3a0: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
a3b0: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
a3c0: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
a3d0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
a3e0: 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75  .** any write cu
a3f0: 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
a400: 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22  dated ("tripped"
a410: 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69   - as in "trippi
a420: 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20  ng a circuit.** 
a430: 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61  breaker") and ma
a440: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69  de to return tri
a450: 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61  pCode if there a
a460: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a  re any further.*
a470: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73  * attempts to us
a480: 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20  e that cursor.  
a490: 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d  Read cursors rem
a4a0: 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c  ain open and val
a4b0: 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73  id.** but are "s
a4c0: 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74 68  aved" in case th
a4d0: 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61 72  e table pages ar
a4e0: 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a  e moved around..
a4f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
a500: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74  ollbackAll(sqlit
a510: 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70  e3 *db, int trip
a520: 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Code){.  int i;.
a530: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20    int inTrans = 
a540: 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43  0;.  int schemaC
a550: 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28  hange;.  assert(
a560: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a570: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
a580: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
a590: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a5a0: 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c  .  /* Obtain all
a5b0: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20   b-tree mutexes 
a5c0: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e  before making an
a5d0: 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65  y calls to Btree
a5e0: 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a  Rollback(). .  *
a5f0: 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74  * This is import
a600: 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20  ant in case the 
a610: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
a620: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61  g rolled back ha
a630: 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20  s.  ** modified 
a640: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
a650: 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72  ema. If the b-tr
a660: 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e  ee mutexes are n
a670: 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65  ot taken.  ** he
a680: 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72  re, then another
a690: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f   shared-cache co
a6a0: 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73  nnection might s
a6b0: 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a  neak in between.
a6c0: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
a6d0: 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  e rollback and s
a6e0: 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69  chema reset, whi
a6f0: 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c  ch can cause fal
a700: 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69  se.  ** corrupti
a710: 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f  on reports in so
a720: 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20  me cases.  */.  
a730: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
a740: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65  rAll(db);.  sche
a750: 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e  maChange = (db->
a760: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
a770: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21  G_SchemaChange)!
a780: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
a790: 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69  usy==0;..  for(i
a7a0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
a7b0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
a7c0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
a7d0: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  Bt;.    if( p ){
a7e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a7f0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
a800: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  (p) ){.        i
a810: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
a820: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a830: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
a840: 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68  , tripCode, !sch
a850: 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  emaChange);.    
a860: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
a870: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
a880: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
a890: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
a8a0: 69 66 28 20 73 63 68 65 6d 61 43 68 61 6e 67 65  if( schemaChange
a8b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a8c0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
a8d0: 74 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a  tements(db, 0);.
a8e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
a8f0: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
a900: 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a  ection(db);.  }.
a910: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
a920: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
a930: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
a940: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
a950: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
a960: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
a970: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
a980: 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ons = 0;.  db->n
a990: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
a9a0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  = 0;.  db->flags
a9b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
a9c0: 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  rFKs;..  /* If o
a9d0: 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ne has been conf
a9e0: 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  igured, invoke t
a9f0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b  he rollback-hook
aa00: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
aa10: 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  f( db->xRollback
aa20: 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54  Callback && (inT
aa30: 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74  rans || !db->aut
aa40: 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  oCommit) ){.    
aa50: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
aa60: 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62  lback(db->pRollb
aa70: 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ackArg);.  }.}..
aa80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
aa90: 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e  tatic string con
aaa0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
aab0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
aac0: 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  o the error code
aad0: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e  .** specified in
aae0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
aaf0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
ab00: 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41  LITE_NEED_ERR_NA
ab10: 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ME).const char *
ab20: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69  sqlite3ErrName(i
ab30: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
ab40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
ab50: 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63  .  int i, origRc
ab60: 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30   = rc;.  for(i=0
ab70: 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d  ; i<2 && zName==
ab80: 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78  0; i++, rc &= 0x
ab90: 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ff){.    switch(
aba0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73   rc ){.      cas
abb0: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
abd0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  me = "SQLITE_OK"
abe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
abf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ac00: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a  se SQLITE_ERROR:
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
ac20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
ac30: 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROR";           
ac40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac50: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
ac60: 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 7a  _SNAPSHOT:     z
ac70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
ac80: 52 52 4f 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20  RROR_SNAPSHOT"; 
ac90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aca0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
acb0: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
acc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
acd0: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
ace0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
acf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
ad00: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
ad10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ad20: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
ad30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
ad50: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
ad60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad70: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
ad80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
ada0: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
adb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
adc0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
add0: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
ade0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adf0: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
ae00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ae10: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
ae20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ae30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae40: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
ae50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae60: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
ae70: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
ae80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae90: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
aea0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aeb0: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
aec0: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
aed0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aee0: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
aef0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
af00: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
af10: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
af20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af30: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
af40: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
af50: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
af60: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
af70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
af80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
af90: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
afa0: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
afc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
afd0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
afe0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
aff0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b000: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
b010: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b020: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b030: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
b040: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b050: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
b060: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b070: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b080: 5f 43 41 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d  _CANTINIT:  zNam
b090: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b0a0: 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20  ONLY_CANTINIT"; 
b0b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b0c0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
b0d0: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
b0e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
b0f0: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
b100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b110: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
b120: 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e  LY_DBMOVED:   zN
b130: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
b140: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b  ADONLY_DBMOVED";
b150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b160: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
b170: 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a  NLY_DIRECTORY: z
b180: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
b190: 45 41 44 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52  EADONLY_DIRECTOR
b1a0: 59 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  Y";break;.      
b1b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
b1c0: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
b1d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b1e0: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
b1f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b200: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b210: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
b220: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b230: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
b240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b250: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b260: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
b270: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b280: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
b290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b2a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b2b0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
b2c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b2d0: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
b2e0: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
b2f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b300: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
b310: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b320: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
b330: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b340: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b350: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
b360: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b370: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
b380: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b390: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b3a0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
b3b0: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
b3c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b3d0: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
b3e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b3f0: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
b400: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
b410: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
b420: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
b430: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b440: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
b450: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b460: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
b470: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
b480: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b490: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
b4a0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
b4b0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
b4c0: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
b4d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b4f0: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
b500: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b510: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
b520: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b530: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b540: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
b550: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b560: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
b570: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b580: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
b590: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
b5a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b5b0: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
b5c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b5d0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
b5e0: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
b5f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b600: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
b610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b620: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b630: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b640: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b670: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b680: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
b690: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b6a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b6b0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b6c0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b6d0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
b6e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b6f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
b700: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
b710: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b720: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
b730: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b740: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b750: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
b760: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b770: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
b780: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b790: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b7a0: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
b7b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b7c0: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
b7d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b7e0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b7f0: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
b800: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b810: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
b820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b830: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b840: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
b850: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b860: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
b870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b880: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b890: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
b8a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b8b0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
b8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b8d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b8e0: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
b8f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b900: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
b910: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b920: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b930: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
b940: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b950: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
b960: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
b970: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b980: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
b990: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b9a0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
b9b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b9c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9d0: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
b9e0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b9f0: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
ba00: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
ba10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ba20: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
ba30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ba40: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
ba50: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
ba60: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ba70: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
ba80: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ba90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
baa0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bab0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bac0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
bad0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bae0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
baf0: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
bb00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bb10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
bb20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bb30: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
bb40: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bb50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb60: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
bb70: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb80: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bba0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bbb0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
bbc0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bbd0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
bbe0: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
bbf0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bc00: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bc10: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
bc20: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bc30: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
bc40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc50: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bc60: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
bc70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bc80: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
bc90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bca0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
bcb0: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
bcc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
bcd0: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
bce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcf0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
bd00: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
bd10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
bd20: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
bd30: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
bd40: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
bd50: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
bd60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
bd70: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
bd80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd90: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
bda0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
bdb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bdc0: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
bdd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bde0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
bdf0: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
be00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
be10: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
be20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
be40: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
be50: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
be60: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
be70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
be80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
be90: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
bea0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
beb0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
bec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bed0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bee0: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
bef0: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
bf00: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
bf10: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
bf20: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bf30: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
bf40: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
bf50: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bf60: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
bf70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bf80: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
bf90: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bfc0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bfd0: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
bfe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bff0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
c000: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
c010: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c020: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
c030: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
c040: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c050: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
c060: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c090: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
c0a0: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
c0b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c0c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c0d0: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
c0e0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
c0f0: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
c100: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c110: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c120: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c150: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c160: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
c170: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
c180: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c190: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
c1a0: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
c1b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c1c0: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
c1d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c1e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
c1f0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c220: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
c230: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
c240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c250: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c260: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
c270: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
c280: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
c290: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
c2a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
c2b0: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
c2c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c2d0: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
c2e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c2f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
c300: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
c310: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c320: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
c330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c340: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c350: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
c360: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c370: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
c380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c390: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
c3a0: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
c3b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c3c0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
c3d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c3e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c3f0: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
c400: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c410: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
c420: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c430: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c440: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
c450: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c460: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
c470: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c480: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c490: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
c4a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c4b0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
c4c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c4d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c4e0: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
c4f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c500: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
c510: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c520: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c530: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
c540: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c550: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
c560: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c570: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c580: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c590: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
c5a0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
c5b0: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
c5c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c5d0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c5e0: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c610: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c620: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
c630: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
c640: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c650: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
c660: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c670: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
c680: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c690: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c6a0: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
c6b0: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
c6c0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
c6d0: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
c6e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c6f0: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
c700: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c710: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
c720: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c730: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
c740: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
c750: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
c760: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
c770: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
c780: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
c790: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
c7a0: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
c7b0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
c7c0: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
c7d0: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
c7e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c7f0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
c800: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
c810: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
c820: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
c830: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
c840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
c850: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
c860: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c870: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
c880: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
c890: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
c8a0: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
c8b0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c8c0: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
c8d0: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
c8e0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c8f0: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20  ITE_INTERNAL    
c900: 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  */ 0,.    /* SQL
c910: 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20  ITE_PERM        
c920: 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69  */ "access permi
c930: 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ssion denied",. 
c940: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f     /* SQLITE_ABO
c950: 52 54 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65  RT       */ "que
c960: 72 79 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20  ry aborted",.   
c970: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
c980: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
c990: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
c9a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
c9b0: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
c9c0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
c9d0: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
c9e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
c9f0: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
ca00: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
ca10: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
ca20: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
ca30: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
ca40: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
ca50: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
ca60: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
ca70: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
ca80: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
ca90: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
caa0: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
cab0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
cac0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
cad0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
cae0: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
caf0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
cb00: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
cb10: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
cb20: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
cb30: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
cb40: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
cb50: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cb60: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
cb70: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
cb80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
cb90: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
cba0: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
cbb0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
cbc0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
cbd0: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c  MPTY       */ 0,
cbe0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53  .    /* SQLITE_S
cbf0: 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64  CHEMA      */ "d
cc00: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
cc10: 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20  as changed",.   
cc20: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   /* SQLITE_TOOBI
cc30: 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e  G      */ "strin
cc40: 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
cc50: 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  g",.    /* SQLIT
cc60: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f  E_CONSTRAINT  */
cc70: 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   "constraint fai
cc80: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
cc90: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20  ITE_MISMATCH    
cca0: 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  */ "datatype mis
ccb0: 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53  match",.    /* S
ccc0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20  QLITE_MISUSE    
ccd0: 20 20 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65    */ "bad parame
cce0: 74 65 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49  ter or other API
ccf0: 20 6d 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66   misuse",.#ifdef
cd00: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
cd10: 4c 46 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  LFS.    /* SQLIT
cd20: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
cd30: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
cd40: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
cd50: 22 2c 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20  ",.#else.    /* 
cd60: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
cd70: 20 20 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a     */ 0,.#endif.
cd80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55      /* SQLITE_AU
cd90: 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75  TH        */ "au
cda0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
cdb0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
cdc0: 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a  TE_FORMAT      *
cdd0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
cde0: 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a  TE_RANGE       *
cdf0: 2f 20 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  / "column index 
ce00: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
ce10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
ce20: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
ce30: 65 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  e is not a datab
ce40: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
ce50: 49 54 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20  ITE_NOTICE      
ce60: 2a 2f 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e  */ "notification
ce70: 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f   message",.    /
ce80: 2a 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  * SQLITE_WARNING
ce90: 20 20 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67       */ "warning
cea0: 20 6d 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a   message",.  };.
ceb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
cec0: 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72  rr = "unknown er
ced0: 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20  ror";.  switch( 
cee0: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
cef0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
cf00: 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45  BACK: {.      zE
cf10: 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20  rr = "abort due 
cf20: 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20  to ROLLBACK";.  
cf30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cf40: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cf50: 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45  _ROW: {.      zE
cf60: 72 72 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f  rr = "another ro
cf70: 77 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20  w available";.  
cf80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cf90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
cfa0: 5f 44 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a  _DONE: {.      z
cfb0: 45 72 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72  Err = "no more r
cfc0: 6f 77 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a  ows available";.
cfd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cfe0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
cff0: 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78  {.      rc &= 0x
d000: 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ff;.      if( AL
d010: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
d020: 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67  c<ArraySize(aMsg
d030: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
d040: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
d050: 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20   = aMsg[rc];.   
d060: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
d080: 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn zErr;.}../*
d090: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d0a0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
d0b0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
d0c0: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
d0d0: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
d0e0: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
d0f0: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
d100: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
d110: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
d120: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
d130: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
d140: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
d150: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  * argument..**.*
d160: 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
d170: 6f 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c  o to retry the l
d180: 6f 63 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ock.  Return zer
d190: 6f 20 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67  o to stop trying
d1a0: 0a 2a 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51  .** and cause SQ
d1b0: 4c 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53  Lite to return S
d1c0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73  QLITE_BUSY..*/.s
d1d0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
d1e0: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
d1f0: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72  ack(.  void *ptr
d200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d210: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d220: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
d230: 63 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  count,          
d240: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d250: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
d260: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20  s been busy */. 
d270: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d280: 46 69 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65  File      /* The
d290: 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74   file on which t
d2a0: 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64  he lock occurred
d2b0: 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54   */.){.#if SQLIT
d2c0: 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45  E_OS_WIN || HAVE
d2d0: 5f 55 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69  _USLEEP.  /* Thi
d2e0: 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 73 79  s case is for sy
d2f0: 73 74 65 6d 73 20 74 68 61 74 20 68 61 76 65 20  stems that have 
d300: 73 75 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65  support for slee
d310: 70 69 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f  ping for fractio
d320: 6e 73 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63  ns of.  ** a sec
d330: 6f 6e 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20  ond.  Examples: 
d340: 20 41 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73   All windows sys
d350: 74 65 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65  tems, unix syste
d360: 6d 73 20 77 69 74 68 20 75 73 6c 65 65 70 28 29  ms with usleep()
d370: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
d380: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
d390: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
d3a0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
d3b0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
d3c0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
d3d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
d3e0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
d3f0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
d400: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
d410: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
d420: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
d430: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
d440: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
d450: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
d460: 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20  tr;.  int tmout 
d470: 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75  = db->busyTimeou
d480: 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20  t;.  int delay, 
d490: 70 72 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53  prior;..#ifdef S
d4a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54  QLITE_ENABLE_SET
d4b0: 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28  LK_TIMEOUT.  if(
d4c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
d4d0: 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49  ntrol(pFile,SQLI
d4e0: 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49  TE_FCNTL_LOCK_TI
d4f0: 4d 45 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53  MEOUT,&tmout)==S
d500: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d510: 69 66 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20  if( count ){.   
d520: 20 20 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20     tmout = 0;.  
d530: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
d540: 65 43 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20  eControl(pFile, 
d550: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
d560: 4b 5f 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75  K_TIMEOUT, &tmou
d570: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
d580: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
d590: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
d5a0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
d5b0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d5c0: 52 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  R(pFile);.#endif
d5d0: 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
d5e0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75  >=0 );.  if( cou
d5f0: 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20  nt < NDELAY ){. 
d600: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
d610: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72  s[count];.    pr
d620: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75  ior = totals[cou
d630: 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt];.  }else{.  
d640: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
d650: 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20  [NDELAY-1];.    
d660: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e  prior = totals[N
d670: 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79  DELAY-1] + delay
d680: 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d  *(count-(NDELAY-
d690: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1));.  }.  if( p
d6a0: 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74  rior + delay > t
d6b0: 6d 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61  mout ){.    dela
d6c0: 79 20 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f  y = tmout - prio
d6d0: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
d6e0: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
d6f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
d700: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
d710: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
d720: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
d730: 2f 2a 20 54 68 69 73 20 63 61 73 65 20 66 6f 72  /* This case for
d740: 20 75 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68   unix systems th
d750: 61 74 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29  at lack usleep()
d760: 20 73 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70   support.  Sleep
d770: 69 6e 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  ing.  ** must be
d780: 20 64 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65   done in increme
d790: 6e 74 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63  nts of whole sec
d7a0: 6f 6e 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  onds */.  sqlite
d7b0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
d7c0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d   *)ptr;.  int tm
d7d0: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
d7e0: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
d7f0: 6f 75 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  out;.  UNUSED_PA
d800: 52 41 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a  RAMETER(pFile);.
d810: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
d820: 31 30 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a  1000 > tmout ){.
d830: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d840: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
d850: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
d860: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
d870: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
d880: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
d890: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
d8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d8b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
d8c0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
d8d0: 20 66 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69   failed to acqui
d8e0: 72 65 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  re a.** lock on 
d8f0: 56 46 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a  VFS file pFile..
d900: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
d910: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
d920: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
d930: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
d940: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
d950: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
d960: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
d970: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
d980: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d990: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d9a0: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
d9b0: 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  , sqlite3_file *
d9c0: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
d9d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79  ;.  if( p->xBusy
d9e0: 48 61 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d  Handler==0 || p-
d9f0: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
da00: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45  n 0;.  if( p->bE
da10: 78 74 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20  xtraFileArg ){. 
da20: 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74     /* Add an ext
da30: 72 61 20 70 61 72 61 6d 65 74 65 72 20 77 69 74  ra parameter wit
da40: 68 20 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e  h the pFile poin
da50: 74 65 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ter to the end o
da60: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c  f the.    ** cal
da70: 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c  lback argument l
da80: 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28  ist */.    int (
da90: 2a 78 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74  *xTra)(void*,int
daa0: 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  ,sqlite3_file*);
dab0: 0a 20 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74  .    xTra = (int
dac0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71  (*)(void*,int,sq
dad0: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e  lite3_file*))p->
dae0: 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
daf0: 20 20 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70    rc = xTra(p->p
db00: 42 75 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73  BusyArg, p->nBus
db10: 79 2c 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c  y, pFile);.  }el
db20: 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63  se{.    /* Legac
db30: 79 20 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e  y style busy han
db40: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  dler callback */
db50: 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75  .    rc = p->xBu
db60: 73 79 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75  syHandler(p->pBu
db70: 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  syArg, p->nBusy)
db80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
db90: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
dba0: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
dbb0: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
dbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
dbd0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
dbe0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
dbf0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
dc00: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
dc10: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
dc20: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
dc30: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
dc40: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
dc50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dc60: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
dc70: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dc80: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
dc90: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
dca0: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
dcb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
dcc0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
dcd0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
dce0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
dcf0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
dd00: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
dd10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
dd20: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
dd30: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
dd40: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
dd50: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
dd60: 48 61 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67  Handler.pBusyArg
dd70: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
dd80: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
dd90: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
dda0: 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69  Handler.bExtraFi
ddb0: 6c 65 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d  leArg = 0;.  db-
ddc0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30  >busyTimeout = 0
ddd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
dde0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ddf0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
de00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
de10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
de20: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
de30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
de40: 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f  ine sets the pro
de50: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66  gress callback f
de60: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
de70: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
de80: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
de90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
dea0: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
deb0: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
dec0: 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62  llback will.** b
ded0: 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20  e invoked every 
dee0: 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f  nOps opcodes..*/
def0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72  .void sqlite3_pr
df00: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a  ogress_handler(.
df10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
df20: 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e    int nOps,.  in
df30: 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76  t (*xProgress)(v
df40: 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a  oid*), .  void *
df50: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
df60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
df70: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
df80: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
df90: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
dfa0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
dfb0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
dfc0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
dfd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
dfe0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
dff0: 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b  .  if( nOps>0 ){
e000: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
e010: 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a  ss = xProgress;.
e020: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
e030: 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64  sOps = (unsigned
e040: 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70  )nOps;.    db->p
e050: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
e060: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
e070: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
e080: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
e090: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
e0a0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
e0b0: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
e0c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e0d0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
e0e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
e0f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
e100: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
e110: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
e120: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
e130: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
e140: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
e150: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
e160: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
e170: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
e180: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
e190: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20  int ms){.#ifdef 
e1a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e1b0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
e1c0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
e1d0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
e1e0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
e1f0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
e200: 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71  ( ms>0 ){.    sq
e210: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
e220: 65 72 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76  er(db, (int(*)(v
e230: 6f 69 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65  oid*,int))sqlite
e240: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
e250: 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ack,.           
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20    (void*)db);.  
e280: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
e290: 74 20 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e  t = ms;.    db->
e2a0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74  busyHandler.bExt
e2b0: 72 61 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20  raFileArg = 1;. 
e2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
e2d0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e2e0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
e2f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
e310: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
e320: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
e330: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
e340: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
e350: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
e360: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
e370: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
e380: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e390: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e3a0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e3b0: 28 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c  (db) && (db==0 |
e3c0: 7c 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  | db->magic!=SQL
e3d0: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
e3e0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
e3f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e400: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
e410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
e420: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
e430: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e440: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e450: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
e460: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
e470: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
e480: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
e490: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
e4a0: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
e4b0: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
e4c0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
e4d0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
e4e0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
e4f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e500: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
e510: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
e520: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
e530: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
e540: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
e550: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e560: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
e570: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e580: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
e590: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
e5a0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
e5b0: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
e5c0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
e5d0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e5e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e5f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
e600: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
e610: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e620: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
e630: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
e640: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
e650: 20 76 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28   void (*xValue)(
e660: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e670: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76  ),.  void (*xInv
e680: 65 72 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  erse)(sqlite3_co
e690: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e6a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e6b0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
e6c0: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
e6d0: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
e6e0: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
e6f0: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
e700: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e710: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e720: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e730: 28 20 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78  ( xValue==0 || x
e740: 53 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66  SFunc==0 );.  if
e750: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
e760: 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
e770: 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61    /* Must have a
e780: 20 76 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20   valid name */. 
e790: 20 20 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20    || (xSFunc!=0 
e7a0: 26 26 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20  && xFinal!=0)   
e7b0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68       /* Not both
e7c0: 20 78 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e   xSFunc and xFin
e7d0: 61 6c 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46  al */.   || ((xF
e7e0: 69 6e 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70  inal==0)!=(xStep
e7f0: 3d 3d 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42  ==0))       /* B
e800: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f  oth or neither o
e810: 66 20 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74  f xFinal and xSt
e820: 65 70 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56  ep */.   || ((xV
e830: 61 6c 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65  alue==0)!=(xInve
e840: 72 73 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42  rse==0))    /* B
e850: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f  oth or neither o
e860: 66 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72  f xValue, xInver
e870: 73 65 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72  se */.   || (nAr
e880: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
e890: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
e8a0: 5f 41 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35  _ARG).   || (255
e8b0: 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  <(nName = sqlite
e8c0: 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63  3Strlen30( zFunc
e8d0: 74 69 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b  tionName))).  ){
e8e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e8f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
e900: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53    }..  assert( S
e910: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
e920: 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45  ANT==SQLITE_DETE
e930: 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65  RMINISTIC );.  e
e940: 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20  xtraFlags = enc 
e950: 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  &  SQLITE_DETERM
e960: 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26  INISTIC;.  enc &
e970: 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45  = (SQLITE_FUNC_E
e980: 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e  NCMASK|SQLITE_AN
e990: 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53  Y);.  .#ifndef S
e9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
e9b0: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
e9c0: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
e9d0: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
e9e0: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
e9f0: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
ea00: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
ea10: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
ea20: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
ea30: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
ea40: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
ea50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
ea60: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
ea70: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
ea80: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
ea90: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
eaa0: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
eab0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
eac0: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
ead0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
eae0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
eaf0: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
eb00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
eb10: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
eb20: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
eb30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
eb40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eb50: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
eb60: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
eb70: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c  rg, SQLITE_UTF8|
eb80: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
eb90: 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20       pUserData, 
eba0: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
ebb0: 46 69 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78  Final, xValue, x
ebc0: 49 6e 76 65 72 73 65 2c 20 70 44 65 73 74 72 75  Inverse, pDestru
ebd0: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
ebe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ebf0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ec00: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ec10: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
ec20: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
ec30: 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c  16LE|extraFlags,
ec40: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
ec50: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
ec60: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61  tep, xFinal, xVa
ec70: 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70  lue, xInverse, p
ec80: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
ec90: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
eca0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ecb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
ecc0: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
ecd0: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
ece0: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
ecf0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
ed00: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
ed10: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
ed20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
ed30: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
ed40: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
ed50: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
ed60: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
ed70: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
ed80: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
ed90: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
eda0: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
edb0: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
edc0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
edd0: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
ede0: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
edf0: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
ee00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
ee10: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
ee20: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
ee30: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
ee40: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
ee50: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
ee60: 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  enc, 0);.  if( p
ee70: 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67   && (p->funcFlag
ee80: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
ee90: 45 4e 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65  ENCMASK)==(u32)e
eea0: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
eeb0: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
eec0: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
eed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
eee0: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
eef0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
ef00: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
ef10: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
ef20: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
ef30: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
ef40: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
ef50: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
ef60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
ef70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ef80: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
ef90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
efa0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
efb0: 65 6d 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20  ements(db, 0);. 
efc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20     }.  }..  p = 
efd0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
efe0: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
eff0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
f000: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
f010: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
f020: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
f030: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
f040: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
f050: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
f060: 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69  f an older versi
f070: 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  on of the functi
f080: 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67  on with a config
f090: 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20  ured destructor 
f0a0: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  is.  ** being re
f0b0: 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68  placed invoke th
f0c0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
f0d0: 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  ction here. */. 
f0e0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
f0f0: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20  (db, p);..  if( 
f100: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
f110: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
f120: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d  nRef++;.  }.  p-
f130: 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d  >u.pDestructor =
f140: 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20   pDestructor;.  
f150: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28  p->funcFlags = (
f160: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
f170: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
f180: 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73  SK) | extraFlags
f190: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d  ;.  testcase( p-
f1a0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
f1b0: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
f1c0: 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63  C );.  p->xSFunc
f1d0: 20 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75   = xSFunc ? xSFu
f1e0: 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d  nc : xStep;.  p-
f1f0: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
f200: 6e 61 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65  nal;.  p->xValue
f210: 20 3d 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e   = xValue;.  p->
f220: 78 49 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65  xInverse = xInve
f230: 72 73 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  rse;.  p->pUserD
f240: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
f250: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
f260: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
f270: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f280: 2a 0a 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63  *.** Worker func
f290: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66  tion used by utf
f2a0: 2d 38 20 41 50 49 73 20 74 68 61 74 20 63 72 65  -8 APIs that cre
f2b0: 61 74 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e  ate new function
f2c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
f2d0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
f2e0: 69 6f 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69  ion().**    sqli
f2f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
f300: 69 6f 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73  ion_v2().**    s
f310: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69  qlite3_create_wi
f320: 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a  ndow_function().
f330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
f340: 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28  eateFunctionApi(
f350: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f360: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f370: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
f380: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
f390: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
f3a0: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
f3b0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f3c0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
f3d0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
f3e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
f3f0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
f400: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
f410: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
f420: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
f430: 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74   (*xValue)(sqlit
f440: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
f450: 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29  void (*xInverse)
f460: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
f470: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
f480: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  lue**),.  void(*
f490: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29  xDestroy)(void*)
f4a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
f4b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
f4c0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
f4d0: 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  Arg = 0;..#ifdef
f4e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f4f0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f500: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f510: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
f530: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
f540: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f550: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f560: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
f570: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
f580: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
f590: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  ctor *)sqlite3Ma
f5a0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63  lloc(sizeof(Func
f5b0: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
f5c0: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
f5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
f5e0: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
f5f0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
f600: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
f610: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65   }.    pArg->nRe
f620: 66 20 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d  f = 0;.    pArg-
f630: 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73  >xDestroy = xDes
f640: 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e  troy;.    pArg->
f650: 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20  pUserData = p;. 
f660: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f670: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
f680: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
f690: 2c 20 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75  , p, .      xSFu
f6a0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
f6b0: 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65  l, xValue, xInve
f6c0: 72 73 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20  rse, pArg.  );. 
f6d0: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
f6e0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
f6f0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f700: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78  LITE_OK );.    x
f710: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
f720: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72  sqlite3_free(pAr
f730: 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20  g);.  }.. out:. 
f740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
f750: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
f760: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f770: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f780: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f790: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
f7a0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
f7b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f7c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
f7d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f7e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f7f0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
f800: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
f810: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
f820: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
f830: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f840: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
f850: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
f860: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f870: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f880: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
f890: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
f8a0: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
f8b0: 72 65 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e  return createFun
f8c0: 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75  ctionApi(db, zFu
f8d0: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
f8e0: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
f8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20       xFinal, 0, 
f920: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
f930: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
f940: 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
f950: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
f960: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
f970: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
f980: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
f990: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
f9a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
f9b0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
f9c0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
f9d0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
f9e0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
f9f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
fa00: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
fa10: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fa20: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
fa30: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
fa40: 7b 0a 20 20 72 65 74 75 72 6e 20 63 72 65 61 74  {.  return creat
fa50: 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c  eFunctionApi(db,
fa60: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
fa70: 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53  c, p, xSFunc, xS
fa80: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
fab0: 20 30 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29   0, 0, xDestroy)
fac0: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
fad0: 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75  create_window_fu
fae0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
faf0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
fb00: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
fb10: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
fb20: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
fb30: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
fb40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fb50: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fb60: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fb70: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
fb80: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
fb90: 20 28 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74   (*xValue)(sqlit
fba0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
fbb0: 76 6f 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29  void (*xInverse)
fbc0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
fbd0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
fbe0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
fbf0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
fc00: 20 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   *).){.  return 
fc10: 63 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70  createFunctionAp
fc20: 69 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  i(db, zFunc, nAr
fc30: 67 2c 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53  g, enc, p, 0, xS
fc40: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
fc70: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
fc80: 65 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a  e, xDestroy);.}.
fc90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fca0: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
fcb0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
fcc0: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
fcd0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
fce0: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
fcf0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
fd00: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
fd10: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fd20: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
fd30: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fd40: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fd50: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
fd60: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
fd70: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
fd80: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
fd90: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
fda0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
fdb0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
fdc0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66  ar *zFunc8;..#if
fdd0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
fde0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
fdf0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
fe00: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
fe10: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
fe20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fe30: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
fe40: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
fe50: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
fe60: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
fe70: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
fe80: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
fe90: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
fea0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
feb0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
fec0: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
fed0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
fee0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
fef0: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
ff00: 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70   p, xSFunc,xStep
ff10: 2c 78 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a  ,xFinal,0,0,0);.
ff20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ff30: 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72  db, zFunc8);.  r
ff40: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
ff50: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
ff60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ff70: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
ff80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ff90: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
ffa0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65  following is the
ffb0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ffc0: 6f 66 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69  of an SQL functi
ffd0: 6f 6e 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a  on that always.*
ffe0: 2a 20 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20  * fails with an 
fff0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
10000 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 66  ating that the f
10010 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
10020 69 6e 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20  in the.** wrong 
10030 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71  context.  The sq
10040 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
10050 75 6e 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69  unction() API mi
10060 67 68 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a  ght construct.**
10070 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
10080 61 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  at use this rout
10090 69 6e 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ine so that the 
100a0 66 75 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65  functions will e
100b0 78 69 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65  xist.** for name
100c0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20   resolution but 
100d0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65  are actually ove
100e0 72 6c 6f 61 64 65 64 20 62 79 20 74 68 65 20 78  rloaded by the x
100f0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20  FindFunction.** 
10100 6d 65 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61  method of virtua
10110 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  l tables..*/.sta
10120 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
10130 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28  InvalidFunction(
10140 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
10150 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a  xt *context,  /*
10160 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   The function ca
10170 6c 6c 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  lling context */
10180 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20  .  int NotUsed, 
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
101a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
101b0 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
101c0 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
101d0 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
101e0 64 32 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66  d2   /* Value of
101f0 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
10200 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
10210 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
10220 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
10230 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
10240 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  t);.  char *zErr
10250 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
10260 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
10270 6f 74 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72  otUsed2);.  zErr
10280 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10290 74 66 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c  tf(.      "unabl
102a0 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  e to use functio
102b0 6e 20 25 73 20 69 6e 20 74 68 65 20 72 65 71 75  n %s in the requ
102c0 65 73 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20  ested context", 
102d0 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
102e0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
102f0 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31  ontext, zErr, -1
10300 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
10310 65 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zErr);.}../*.*
10320 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
10330 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
10340 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
10350 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
10370 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
10380 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
10390 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
103a0 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
103b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
103c0 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
103d0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
103e0 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
103f0 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
10400 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
10410 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
10420 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
10430 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
10440 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
10450 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
10460 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
10470 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
10480 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
10490 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
104a0 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
104b0 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
104c0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
104d0 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
104e0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
104f0 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
10500 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
10510 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
10520 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
10530 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
10540 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
10550 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
10560 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f   rc;.  char *zCo
10570 70 79 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  py;..#ifdef SQLI
10580 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10590 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
105a0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
105b0 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
105c0 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20  || nArg<-2 ){.  
105d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
105f0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
10600 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10610 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d  ->mutex);.  rc =
10620 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
10630 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
10640 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
10650 38 2c 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69  8, 0)!=0;.  sqli
10660 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10670 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
10680 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 53 51  ( rc ) return SQ
10690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79  LITE_OK;.  zCopy
106a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
106b0 74 66 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  tf(zName);.  if(
106c0 20 7a 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75   zCopy==0 ) retu
106d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
106e0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
106f0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
10700 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
10710 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
10720 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
10740 6f 70 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61  opy, sqlite3Inva
10750 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
10760 30 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  0, sqlite3_free)
10770 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10780 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
10790 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
107a0 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
107b0 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
107c0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
107d0 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
107e0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
107f0 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
10800 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
10810 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
10820 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
10830 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
10840 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
10850 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
10860 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
10870 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
10880 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
10890 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ement..*/.#ifnde
108a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
108b0 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73  PRECATED.void *s
108c0 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
108d0 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a  ite3 *db, void(*
108e0 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
108f0 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
10900 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
10910 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
10920 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10930 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10940 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10950 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
10960 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
10970 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
10980 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
10990 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
109a0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
109b0 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
109c0 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
109d0 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >mTrace = xTrace
109e0 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f   ? SQLITE_TRACE_
109f0 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62  LEGACY : 0;.  db
10a00 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28  ->xTrace = (int(
10a10 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69  *)(u32,void*,voi
10a20 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65  d*,void*))xTrace
10a30 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
10a40 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
10a50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10a60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10a70 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
10a80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10a90 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f  IT_DEPRECATED */
10aa0 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20  ../* Register a 
10ab0 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75  trace callback u
10ac0 73 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e  sing the version
10ad0 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  -2 interface..*/
10ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  .int sqlite3_tra
10af0 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  ce_v2(.  sqlite3
10b00 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69      /* Trace thi
10b30 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
10b40 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63    unsigned mTrac
10b50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b70 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74  Mask of events t
10b80 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20  o be traced */. 
10b90 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e   int(*xTrace)(un
10ba0 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69  signed,void*,voi
10bb0 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43  d*,void*),  /* C
10bc0 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b  allback to invok
10bd0 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  e */.  void *pAr
10be0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a    /* Context */.
10c10 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
10c20 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10c30 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10c40 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10c50 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
10c60 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
10c70 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
10c80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10c90 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10ca0 0a 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30  .  if( mTrace==0
10cb0 20 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20   ) xTrace = 0;. 
10cc0 20 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29   if( xTrace==0 )
10cd0 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64   mTrace = 0;.  d
10ce0 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61  b->mTrace = mTra
10cf0 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  ce;.  db->xTrace
10d00 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
10d10 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
10d20 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
10d30 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10d40 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
10d50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
10d60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10d70 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
10d80 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66   Register a prof
10d90 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ile function.  T
10da0 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
10db0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
10dc0 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69  stered .** profi
10dd0 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  le function is r
10de0 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
10df0 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20   A NULL profile 
10e00 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
10e10 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67  hat no profiling
10e20 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
10e30 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f   non-NULL.** pro
10e40 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65  file is a pointe
10e50 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
10e60 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
10e70 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
10e80 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c  n of.** each SQL
10e90 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10ea0 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  is run..*/.void 
10eb0 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65  *sqlite3_profile
10ec0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10ed0 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69  .  void (*xProfi
10ee0 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  le)(void*,const 
10ef0 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e  char*,sqlite_uin
10f00 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
10f10 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  rg.){.  void *pO
10f20 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
10f30 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10f40 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10f50 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10f60 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
10f70 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
10f80 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
10f90 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
10fa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10fb0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10fc0 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
10fd0 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
10fe0 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
10ff0 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
11000 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
11010 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53   db->mTrace &= S
11020 51 4c 49 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c  QLITE_TRACE_NONL
11030 45 47 41 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66  EGACY_MASK;.  if
11040 28 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29  ( db->xProfile )
11050 20 64 62 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53   db->mTrace |= S
11060 51 4c 49 54 45 5f 54 52 41 43 45 5f 58 50 52 4f  QLITE_TRACE_XPRO
11070 46 49 4c 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f  FILE;.  sqlite3_
11080 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11090 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
110a0 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
110b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
110c0 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e  EPRECATED */.#en
110d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
110e0 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
110f0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
11100 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
11110 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
11120 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
11130 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
11140 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
11150 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
11160 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
11170 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
11180 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
11190 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
111a0 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
111b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
111c0 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
111d0 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
111e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
111f0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
11200 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
11210 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
11220 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
11230 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
11240 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
11250 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
11260 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
11270 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
11280 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
11290 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
112a0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
112b0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
112c0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
112d0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
112e0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
112f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11300 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
11310 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
11320 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d  CommitArg;.  db-
11330 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
11340 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
11350 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d  db->pCommitArg =
11360 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
11370 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11380 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11390 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pOld;.}../*.**
113a0 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
113b0 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
113c0 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72  ed each time a r
113d0 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  ow is updated,.*
113e0 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  * inserted or de
113f0 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  leted using this
11400 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11410 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
11420 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
11430 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
11440 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
11450 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
11460 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
11470 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
11480 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
11490 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20  ,int,char const 
114a0 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73  *,char const *,s
114b0 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20  qlite_int64),.  
114c0 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
114d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
114e0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
114f0 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
11500 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65  id *pRet;..#ifde
11510 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11520 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
11530 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11540 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
11550 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
11560 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
11570 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
11580 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
11590 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
115a0 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
115b0 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
115c0 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
115d0 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
115e0 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
115f0 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
11600 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11610 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
11620 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
11630 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
11640 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
11650 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
11660 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11670 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
11680 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
11690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
116a0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
116b0 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
116c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
116d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
116e0 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
116f0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
11700 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
11710 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
11720 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
11730 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
11740 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
11750 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
11760 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
11770 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
11780 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11790 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
117a0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
117b0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
117c0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
117d0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
117e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
117f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
11800 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11810 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
11820 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
11830 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
11840 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
11850 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
11860 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
11870 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
11880 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11890 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
118a0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64  rn pRet;.}..#ifd
118b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
118c0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
118d0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
118e0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
118f0 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
11900 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  e a row is updat
11910 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ed,.** inserted 
11920 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  or deleted using
11930 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
11940 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
11950 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75  id *sqlite3_preu
11960 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
11970 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11980 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
11990 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
119a0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
119b0 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b   void(*xCallback
119c0 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  )(         /* Ca
119d0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
119e0 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c  */.    void*,sql
119f0 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63  ite3*,int,char c
11a00 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74  onst*,char const
11a10 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  *,sqlite3_int64,
11a20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a  sqlite3_int64),.
11a30 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
11a40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11a50 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72  irst callback ar
11a60 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76  gument */.){.  v
11a70 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
11a80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11a90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
11aa0 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70  Ret = db->pPreUp
11ab0 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
11ac0 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
11ad0 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
11ae0 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41   db->pPreUpdateA
11af0 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
11b00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11b10 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
11b20 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
11b30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11b40 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
11b50 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HOOK */..#ifndef
11b60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11b70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
11b80 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
11b90 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
11ba0 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c  d by sqlite3_wal
11bb0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
11bc0 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  )..** Invoke sql
11bd0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
11be0 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  int if the numbe
11bf0 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
11c00 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69  he log file.** i
11c10 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  s greater than s
11c20 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63  qlite3.pWalArg c
11c30 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ast to an intege
11c40 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  r (the value con
11c50 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61  figured by.** wa
11c60 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
11c70 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ())..*/ .int sql
11c80 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
11c90 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  ok(.  void *pCli
11ca0 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
11cb0 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  Argument */.  sq
11cc0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11cd0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
11ce0 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
11cf0 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
11d00 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  * Database */.  
11d10 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20  int nFrame      
11d20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11d30 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66  f WAL */.){.  if
11d40 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45  ( nFrame>=SQLITE
11d50 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69  _PTR_TO_INT(pCli
11d60 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20  entData) ){.    
11d70 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
11d80 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11d90 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
11da0 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
11db0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
11dc0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
11dd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11de0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
11df0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
11e00 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  AL */../*.** Con
11e10 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65  figure an sqlite
11e20 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
11e30 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74  lback to automat
11e40 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
11e50 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  t.** a database 
11e60 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
11e70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11e80 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61  f there are nFra
11e90 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72  me or.** more fr
11ea0 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
11eb0 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65  file. Passing ze
11ec0 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65  ro or a negative
11ed0 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a   value as the.**
11ee0 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65   nFrame paramete
11ef0 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d  r disables autom
11f00 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73  atic checkpoints
11f10 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a   entirely..**.**
11f20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   The callback re
11f30 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73  gistered by this
11f40 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
11f50 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  es any existing 
11f60 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69  callback.** regi
11f70 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c  stered using sql
11f80 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e  ite3_wal_hook().
11f90 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73   Likewise, regis
11fa0 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  tering a callbac
11fb0 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  k.** using sqlit
11fc0 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69  e3_wal_hook() di
11fd0 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d  sables the autom
11fe0 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20  atic checkpoint 
11ff0 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e  mechanism.** con
12000 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20  figured by this 
12010 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
12020 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
12030 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  ocheckpoint(sqli
12040 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72  te3 *db, int nFr
12050 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
12060 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55  ITE_OMIT_WAL.  U
12070 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12080 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
12090 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b  RAMETER(nFrame);
120a0 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51  .#else.#ifdef SQ
120b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
120c0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
120d0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
120e0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
120f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
12100 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  T;.#endif.  if( 
12110 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
12120 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
12130 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
12140 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
12150 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
12160 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
12170 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
12180 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
12190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
121a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
121b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
121c0 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
121d0 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
121e0 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
121f0 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
12200 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
12210 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
12220 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
12230 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
12240 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
12250 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
12280 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
12290 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
122a0 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
122b0 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
122c0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
122d0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
12300 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
12310 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
12320 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12330 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
12340 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20  d *pRet;.#ifdef 
12350 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
12360 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
12370 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
12380 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
12390 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
123a0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
123b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
123c0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
123d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
123e0 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
123f0 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
12400 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
12410 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
12420 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
12430 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12440 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12450 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
12460 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
12470 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
12480 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
12490 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69  tabase zDb..*/.i
124a0 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
124b0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
124c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
124f0 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
12500 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
12510 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
12520 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
12530 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  base (or NULL) *
12540 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20  /.  int eMode,  
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48      /* SQLITE_CH
12570 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65  ECKPOINT_* value
12580 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67   */.  int *pnLog
12590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
125a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
125b0 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e  ze of WAL log in
125c0 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74   frames */.  int
125d0 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20   *pnCkpt        
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125f0 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
12600 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63  r of frames chec
12610 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23  kpointed */.){.#
12620 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12630 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53  T_WAL.  return S
12640 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
12650 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
12680 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
12690 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
126a0 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  HED;  /* sqlite3
126b0 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20  .aDb[] index of 
126c0 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  db to checkpoint
126d0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
126e0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
126f0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
12700 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
12710 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
12720 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12730 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e  .#endif..  /* In
12740 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
12750 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
12760 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65   -1 in case an e
12770 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
12780 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70    if( pnLog ) *p
12790 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28  nLog = -1;.  if(
127a0 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70   pnCkpt ) *pnCkp
127b0 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72  t = -1;..  asser
127c0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
127d0 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20  OINT_PASSIVE==0 
127e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
127f0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
12800 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ULL==1 );.  asse
12810 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
12820 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32  POINT_RESTART==2
12830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
12840 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
12850 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20  TRUNCATE==3 );. 
12860 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54   if( eMode<SQLIT
12870 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
12880 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51  SIVE || eMode>SQ
12890 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
128a0 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
128b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
128c0 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68  R-03996-12088 Th
128d0 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75  e M parameter mu
128e0 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68  st be a valid ch
128f0 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  eckpoint.    ** 
12900 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74  mode: */.    ret
12910 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
12920 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
12930 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
12940 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
12950 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b  zDb && zDb[0] ){
12960 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
12970 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
12980 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28   zDb);.  }.  if(
12990 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63   iDb<0 ){.    rc
129a0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
129b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
129c0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
129d0 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
129e0 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
129f0 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
12a00 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61  {.    db->busyHa
12a10 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
12a20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12a30 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
12a40 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
12a50 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
12a60 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
12a70 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   rc);.  }.  rc =
12a80 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
12a90 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49  db, rc);..  /* I
12aa0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
12ab0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
12ac0 2c 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65  , clear the inte
12ad0 72 72 75 70 74 20 66 6c 61 67 20 61 74 20 74 68  rrupt flag at th
12ae0 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20  is.  ** point.  
12af0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  */.  if( db->nVd
12b00 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20  beActive==0 ){. 
12b10 20 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65     db->u1.isInte
12b20 72 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d  rrupted = 0;.  }
12b30 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
12b40 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12b50 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
12b60 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
12b70 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
12b80 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44  abase zDb. If zD
12b90 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66  b is NULL, or if
12ba0 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20   the buffer zDb 
12bb0 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e  points.** to con
12bc0 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e  tains a zero-len
12bd0 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20  gth string, all 
12be0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
12bf0 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b  es are .** check
12c00 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  pointed..*/.int 
12c10 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
12c20 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
12c30 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
12c40 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45  zDb){.  /* EVIDE
12c50 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d  NCE-OF: R-41613-
12c60 32 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65  20553 The sqlite
12c70 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
12c80 28 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c  (D,X) is equival
12c90 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  ent to.  ** sqli
12ca0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
12cb0 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45  nt_v2(D,X,SQLITE
12cc0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
12cd0 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72  IVE,0,0). */.  r
12ce0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61  eturn sqlite3_wa
12cf0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
12d00 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48  db,zDb,SQLITE_CH
12d10 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
12d20 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ,0,0);.}..#ifnde
12d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
12d40 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
12d50 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
12d60 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
12d70 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
12d80 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
12d90 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
12da0 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
12db0 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
12dc0 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
12dd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
12de0 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
12df0 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
12e00 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
12e10 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
12e20 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
12e30 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
12e40 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
12e50 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
12e60 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
12e70 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
12e80 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
12e90 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
12ea0 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
12eb0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
12ec0 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
12ed0 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
12ee0 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
12ef0 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
12f00 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
12f10 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
12f20 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
12f30 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
12f40 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
12f50 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
12f60 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
12f70 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
12f80 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
12f90 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
12fa0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
12fb0 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
12fc0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
12fd0 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
12fe0 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
12ff0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
13000 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
13010 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
13020 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
13030 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
13040 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
13050 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
13060 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
13070 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
13080 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
13090 53 49 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54  SIVE, FULL, REST
130a0 41 52 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41  ART.** or TRUNCA
130b0 54 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  TE..*/.int sqlit
130c0 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  e3Checkpoint(sql
130d0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
130e0 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e  b, int eMode, in
130f0 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70  t *pnLog, int *p
13100 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63  nCkpt){.  int rc
13110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13130 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
13140 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13160 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
13170 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65   through attache
13180 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62  d dbs */.  int b
13190 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Busy = 0;       
131a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
131b0 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53  ue if SQLITE_BUS
131c0 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  Y has been encou
131d0 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ntered */..  ass
131e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
131f0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
13200 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
13210 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67  !pnLog || *pnLog
13220 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ==-1 );.  assert
13230 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e  ( !pnCkpt || *pn
13240 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66  Ckpt==-1 );..  f
13250 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
13260 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b && rc==SQLITE_
13270 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  OK; i++){.    if
13280 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d  ( i==iDb || iDb=
13290 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
132a0 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63  CHED ){.      rc
132b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
132c0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44  heckpoint(db->aD
132d0 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c  b[i].pBt, eMode,
132e0 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
132f0 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30  .      pnLog = 0
13300 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d  ;.      pnCkpt =
13310 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
13320 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
13330 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d  .        bBusy =
13340 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
13350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13370 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
13380 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29  ITE_OK && bBusy)
13390 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
133a0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
133b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
133c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
133d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
133e0 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
133f0 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
13400 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
13410 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
13420 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
13430 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
13440 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
13450 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
13460 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
13470 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
13480 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
13490 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
134a0 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
134b0 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
134c0 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
134d0 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
134e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
134f0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
13500 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
13510 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
13520 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
13530 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
13540 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
13550 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
13560 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
13570 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
13580 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
13590 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
135b0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
135c0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135e0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
13610 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
13620 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13650 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
13660 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
13670 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
13680 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
13690 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
136a0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
136b0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
136c0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
136e0 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
136f0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
13730 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
13760 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
13770 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
137a0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
137b0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
137c0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
137d0 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
137e0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
137f0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
13800 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
13810 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
13820 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
13830 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
13840 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
13850 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
13860 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
13870 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
13880 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
13890 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
138a0 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
138b0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
138c0 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50  RE==3.  UNUSED_P
138d0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
138e0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
138f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
13900 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49  _STORE<1 || SQLI
13910 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a  TE_TEMP_STORE>3.
13920 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13930 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
13940 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
13950 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
13960 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
13970 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
13980 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
13990 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
139a0 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
139b0 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
139c0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
139d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
139e0 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
139f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
13a00 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
13a10 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  EM_BKPT);.  }.  
13a20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
13a30 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
13a40 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
13a50 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
13a60 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
13a70 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
13a80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
13a90 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
13aa0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13ab0 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
13ac0 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
13ad0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
13ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
13af0 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
13b00 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
13b10 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
13b20 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
13b30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
13b40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13b50 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
13b60 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
13b70 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
13b80 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
13b90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13ba0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
13bb0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
13bc0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13bd0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
13be0 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
13bf0 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
13c00 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
13c10 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
13c20 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
13c30 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
13c40 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
13c50 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
13c60 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
13c70 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
13c80 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
13c90 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
13ca0 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
13cb0 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
13cc0 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
13cd0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13ce0 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
13cf0 20 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64      'b', 'a', 'd
13d00 27 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27  ', ' ', 'p', 'a'
13d10 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c  , 'r', 'a', 'm',
13d20 20 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20   'e', 't', 'e', 
13d30 27 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f  'r', ' ',.    'o
13d40 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27  ', 'r', ' ', 'o'
13d50 2c 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c  , 't', 'h', 'e',
13d60 20 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20   'r', ' ', 'A', 
13d70 27 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20  'P', 'I', ' ',. 
13d80 20 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27     'm', 'i', 's'
13d90 2c 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c  , 'u', 's', 'e',
13da0 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
13db0 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
13dc0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
13dd0 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
13de0 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
13df0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
13e00 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
13e10 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
13e20 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
13e30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13e40 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
13e50 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
13e60 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
13e70 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
13e80 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
13e90 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
13ea0 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
13eb0 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
13ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
13ed0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
13ee0 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
13ef0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
13f00 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
13f10 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
13f20 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
13f30 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
13f40 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
13f50 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
13f60 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
13f70 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
13f80 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
13f90 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
13fa0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
13fb0 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
13fc0 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
13fd0 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
13fe0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
13ff0 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
14000 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
14010 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
14020 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
14030 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
14040 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
14050 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
14060 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
14070 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65     sqlite3OomCle
14080 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ar(db);.  }.  sq
14090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
140a0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
140b0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
140c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
140d0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
140e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
140f0 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
14100 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
14110 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
14120 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
14130 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
14140 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
14150 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
14160 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
14170 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
14180 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
14190 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
141a0 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
141b0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
141c0 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
141d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
141e0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
141f0 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
14200 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
14210 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
14220 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
14230 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
14240 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
14250 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
14260 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
14270 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
14280 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
14290 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
142a0 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
142b0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
142c0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
142d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
142e0 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
142f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14310 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
14320 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
14330 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  de;.}.int sqlite
14340 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73  3_system_errno(s
14350 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
14360 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69  eturn db ? db->i
14370 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20  SysErrno : 0;.} 
14380 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20   ../*.** Return 
14390 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
143a0 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
143b0 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
143c0 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
143d0 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77  gument.  For now
143e0 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61  , this simply ca
143f0 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  lls the internal
14400 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29   sqlite3ErrStr()
14410 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
14420 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
14430 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20  ite3_errstr(int 
14440 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  rc){.  return sq
14450 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b  lite3ErrStr(rc);
14460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
14470 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
14480 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
14490 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
144a0 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
144b0 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
144c0 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
144d0 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
144e0 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
144f0 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
14500 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
14510 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64    u8 enc,.  void
14520 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
14530 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
14540 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
14550 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
14560 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
14570 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
14580 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
14590 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65   enc2;.  .  asse
145a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
145b0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
145c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
145d0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
145e0 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
145f0 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
14600 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
14610 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
14620 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
14630 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
14640 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
14650 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
14660 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
14670 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
14680 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
14690 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
146a0 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
146b0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
146c0 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
146d0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
146e0 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
146f0 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
14700 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
14710 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
14720 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
14730 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
14740 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
14750 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
14760 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
14770 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
14780 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
14790 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
147a0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
147b0 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
147c0 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
147d0 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
147e0 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
147f0 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
14800 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
14810 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
14820 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
14830 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
14840 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
14850 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
14860 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
14870 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14880 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14890 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
148a0 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
148b0 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
148c0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
148d0 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
148e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
148f0 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
14900 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
14910 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
14920 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
14930 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
14940 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
14950 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
14960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14970 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
14980 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
14990 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
149a0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 0);..    /* If
149b0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
149c0 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
149d0 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
149e0 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
149f0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
14a00 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
14a10 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
14a20 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
14a30 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
14a40 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
14a50 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
14a60 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
14a70 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
14a80 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
14a90 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
14aa0 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
14ab0 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
14ac0 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
14ad0 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
14ae0 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
14af0 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
14b00 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
14b10 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
14b20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
14b30 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
14b40 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a  ollSeq, zName);.
14b50 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
14b60 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
14b70 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
14b80 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f  ollSeq *p = &aCo
14b90 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
14ba0 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  f( p->enc==pColl
14bb0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  ->enc ){.       
14bc0 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29     if( p->xDel )
14bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
14be0 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b  >xDel(p->pUser);
14bf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14c00 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d         p->xCmp =
14c10 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14c30 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
14c40 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
14c50 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
14c60 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 1);.  if( pCo
14c70 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
14c80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14c90 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
14ca0 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
14cb0 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
14cc0 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
14cd0 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
14ce0 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
14cf0 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
14d00 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
14d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
14d20 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
14d30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14d40 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14d50 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
14d60 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
14d70 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
14d80 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
14d90 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
14da0 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
14db0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
14dc0 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
14dd0 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
14de0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
14df0 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
14e00 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
14e10 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
14e20 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
14e30 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
14e40 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
14e50 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
14e60 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
14e70 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
14e80 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
14e90 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
14ea0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
14eb0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
14ec0 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
14ed0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
14ee0 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
14ef0 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
14f00 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
14f10 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
14f20 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
14f30 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
14f40 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
14f50 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
14f60 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
14f70 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
14f80 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
14f90 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
14fa0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
14fb0 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
14fc0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
14fd0 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
14fe0 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
14ff0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15000 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
15010 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15020 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
15030 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
15040 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
15050 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
15060 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
15070 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
15080 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
15090 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
150a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
150b0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
150c0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
150d0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
150e0 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
150f0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
15100 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
15110 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
15120 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15130 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
15140 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
15150 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
15160 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
15170 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15180 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15190 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
151a0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32  _FUNCTION_ARG>12
151b0 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
151c0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
151d0 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  G must be betwee
151e0 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64  n 0 and 127.#end
151f0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15200 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
15210 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15220 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
15230 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15240 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
15250 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
15260 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15270 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
15280 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
15290 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
152a0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
152b0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
152c0 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
152d0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
152e0 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
152f0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
15300 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
15310 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
15320 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
15330 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
15340 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15350 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
15360 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
15370 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15380 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
15390 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
153a0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
153b0 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
153c0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
153d0 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
153e0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
153f0 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
15400 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
15410 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
15420 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
15430 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
15440 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
15450 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
15460 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
15470 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
15480 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
15490 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
154a0 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
154b0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
154c0 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
154d0 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
154e0 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
154f0 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
15500 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
15510 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
15520 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
15530 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
15540 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
15550 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
15560 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
15570 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
15580 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
15590 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
155a0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
155b0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
155c0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
155d0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
155e0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
155f0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
15600 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
15610 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
15620 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
15630 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
15640 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
15650 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
15660 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
15670 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
15680 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
15690 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
156a0 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
156b0 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
156c0 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
156d0 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
156e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
156f0 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
15700 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
15710 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15720 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
15730 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
15740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15750 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15760 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
15770 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
15780 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
15790 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
157a0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
157b0 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
157c0 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
157d0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
157e0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
157f0 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
15800 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
15810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15820 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15830 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
15840 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
15850 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
15860 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
15870 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15880 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
15890 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
158a0 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
158b0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
158c0 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
158d0 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
158e0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
158f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15900 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15910 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
15920 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15930 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
15940 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15950 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
15960 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
159a0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
159b0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
159c0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
159d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
159e0 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
159f0 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
15a00 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
15a10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15a20 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15a30 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
15a40 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
15a50 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
15a60 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15a70 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15a80 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
15a90 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
15aa0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
15ab0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
15ac0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
15ad0 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
15ae0 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
15af0 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
15b00 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
15b10 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
15b20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
15b30 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
15b40 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
15b50 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
15b60 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
15b70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
15b80 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
15b90 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
15ba0 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
15bb0 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
15bc0 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
15bd0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
15be0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
15bf0 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
15c00 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
15c10 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
15c20 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
15c30 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c50 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
15c60 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
15c70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15c80 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
15c90 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
15ca0 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
15cb0 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
15cc0 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
15cd0 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
15ce0 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
15cf0 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
15d00 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
15d10 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
15d20 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
15d30 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
15d40 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
15d50 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
15d60 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
15d70 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
15d80 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
15d90 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
15da0 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
15db0 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
15dc0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
15dd0 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
15de0 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
15df0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
15e00 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
15e10 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
15e20 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
15e30 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
15e40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
15e50 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
15e60 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
15e70 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
15e80 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
15e90 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
15ea0 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
15eb0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
15ec0 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
15ed0 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
15ee0 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
15ef0 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
15f00 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
15f10 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
15f20 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
15f30 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
15f40 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
15f50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15f60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
15f70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
15f80 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
15f90 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
15fa0 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
15fb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15fc0 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
15fd0 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
15fe0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
15ff0 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
16000 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
16010 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
16020 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16030 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
16040 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
16050 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
16060 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
16070 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
16080 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16090 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
160a0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
160b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
160c0 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
160d0 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
160e0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
160f0 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
16100 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
16110 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
16120 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
16130 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
16140 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
16150 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
16160 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
16170 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
16180 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
16190 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
161a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
161b0 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
161c0 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
161d0 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
161e0 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
161f0 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16210 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
16220 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
16230 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
16240 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
16250 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
16260 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
16270 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
16280 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
16290 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
162a0 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
162b0 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
162e0 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
162f0 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
16300 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
16310 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16320 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
16330 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
16340 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16350 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
16360 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
16370 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
16380 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
16390 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
163a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
163b0 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
163c0 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
163d0 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
163e0 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
163f0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
16400 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
16410 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20  PEN_URI)        
16420 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
16430 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20  8725-32206 */.  
16440 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
16450 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16460 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d  .bOpenUri) /* IM
16470 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38  P: R-51689-46548
16480 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d   */.   && nUri>=
16490 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
164a0 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
164b0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34   /* IMP: R-57884
164c0 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20  -37496 */.  ){. 
164d0 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
164e0 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16500 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
16510 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
16520 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
16530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16540 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
16550 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
16560 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
16570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
16580 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
16590 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
165a0 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20  /.    u64 nByte 
165b0 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
165c0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
165d0 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
165e0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
165f0 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
16600 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
16610 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
16620 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
16630 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
16640 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
16650 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
16660 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
16670 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
16680 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
16690 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
166a0 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
166b0 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
166c0 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
166d0 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
166e0 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
166f0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29  _malloc64(nByte)
16700 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
16710 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16720 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20  _NOMEM_BKPT;..  
16730 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65    iIn = 5;.#ifde
16740 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55  f SQLITE_ALLOW_U
16750 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20  RI_AUTHORITY.   
16760 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
16770 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+5, "///", 3)==
16780 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  0 ){.      iIn =
16790 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   7;.      /* The
167a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69   following condi
167b0 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73  tion causes URIs
167c0 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69   with five leadi
167d0 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
167e0 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69        ** like fi
167f0 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74  le://///host/pat
16800 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65  h to be converte
16810 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65  d into UNCs like
16820 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20   //host/path..  
16830 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65      ** The corre
16840 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20  ct URI for that 
16850 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f  UNC has only two
16860 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67   or four leading
16870 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
16880 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f      ** file://ho
16890 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a  st/path or file:
168a0 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20  ////host/path.  
168b0 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c  But 5 leading sl
168c0 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20  ashes is a .    
168d0 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f    ** common erro
168e0 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20  r, we are told, 
168f0 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20  so we handle it 
16900 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
16910 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
16920 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20  strncmp(zUri+7, 
16930 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20  "///", 3)==0 ){ 
16940 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  iIn++; }.    }el
16950 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
16960 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68  Uri+5, "//localh
16970 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b  ost/", 12)==0 ){
16980 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b  .      iIn = 16;
16990 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
169a0 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
169b0 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
169c0 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
169d0 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
169e0 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
169f0 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
16a00 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
16a10 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
16a20 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
16a30 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
16a40 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
16a50 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
16a60 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
16a70 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
16a80 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
16a90 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
16aa0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16ab0 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
16ac0 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
16ad0 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
16ae0 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
16af0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16b00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16b10 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
16b20 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
16b30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
16b40 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61   Copy the filena
16b50 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79  me and any query
16b60 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f   parameters into
16b70 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65   the zFile buffe
16b80 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64  r. .    ** Decod
16b90 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64  e %HH escape cod
16ba0 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  es along the way
16bb0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16bc0 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   Within this loo
16bd0 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61  p, variable eSta
16be0 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  te may be set to
16bf0 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65   0, 1 or 2, depe
16c00 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
16c10 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  the parsing cont
16c20 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ext. As follows:
16c30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
16c40 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65   0: Parsing file
16c50 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20  -name..    **   
16c60 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20  1: Parsing name 
16c70 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
16c80 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
16c90 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20  rameter..    ** 
16ca0 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c    2: Parsing val
16cb0 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  ue section of a 
16cc0 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
16cd0 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
16ce0 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20  */.    eState = 
16cf0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
16d00 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
16d10 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20   && c!='#' ){.  
16d20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
16d30 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20   if( c=='%' .   
16d40 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
16d50 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d  xdigit(zUri[iIn]
16d60 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ) .       && sql
16d70 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
16d80 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20  i[iIn+1]) .     
16d90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
16da0 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33  octet = (sqlite3
16db0 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
16dc0 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20  n++]) << 4);.   
16dd0 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71       octet += sq
16de0 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
16df0 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20  ri[iIn++]);..   
16e00 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74       assert( oct
16e10 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32  et>=0 && octet<2
16e20 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  56 );.        if
16e30 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69  ( octet==0 ){.#i
16e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
16e50 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52  BLE_URI_00_ERROR
16e60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
16e70 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
16e80 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
16e90 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
16ea0 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
16eb0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
16ec0 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
16ed0 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
16ee0 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
16ef0 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
16f00 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
16f10 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
16f20 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
16f30 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
16f40 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
16f50 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
16f60 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
16f70 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
16f80 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
16f90 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
16fa0 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
16fb0 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
16fc0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
16fd0 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
16ff0 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
17000 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
17010 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
17020 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
17030 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
17040 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
17050 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
17060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17070 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a  continue;.#else.
17080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
17090 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52  ENABLE_URI_00_ER
170a0 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ROR is defined, 
170b0 22 25 30 30 22 20 69 6e 20 61 20 55 52 49 20 69  "%00" in a URI i
170c0 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  s an error. */. 
170d0 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
170e0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
170f0 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65 64  intf("unexpected
17100 20 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a   %%00 in uri");.
17110 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
17120 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
17130 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
17140 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69  e_uri_out;.#endi
17150 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  f.        }.    
17160 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20      c = octet;. 
17170 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
17180 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d  State==1 && (c==
17190 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29  '&' || c=='=') )
171a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
171b0 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29  ile[iOut-1]==0 )
171c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
171d0 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e  n empty option n
171e0 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73  ame. Ignore this
171f0 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68   option altogeth
17200 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
17210 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
17220 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
17230 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d  '#' && zUri[iIn-
17240 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b  1]!='&' ) iIn++;
17250 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
17260 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
17270 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26         if( c=='&
17280 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
17290 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
172a0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  \0';.        }el
172b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53  se{.          eS
172c0 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
172d0 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
172e0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
172f0 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26  f( (eState==0 &&
17300 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74   c=='?') || (eSt
17310 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27  ate==2 && c=='&'
17320 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ) ){.        c =
17330 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61   0;.        eSta
17340 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  te = 1;.      }.
17350 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
17360 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
17370 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31     if( eState==1
17380 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d   ) zFile[iOut++]
17390 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
173a0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
173b0 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
173c0 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  t++] = '\0';..  
173d0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
173e0 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74  ere were any opt
173f0 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74  ions specified t
17400 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  hat should be in
17410 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a  terpreted .    *
17420 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20  * here. Options 
17430 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72  that are interpr
17440 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64  eted here includ
17450 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73  e "vfs" and thos
17460 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f  e that.    ** co
17470 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67  rrespond to flag
17480 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61  s that may be pa
17490 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  ssed to the sqli
174a0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20  te3_open_v2().  
174b0 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a    ** method. */.
174c0 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c      zOpt = &zFil
174d0 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
174e0 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20  0(zFile)+1];.   
174f0 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20   while( zOpt[0] 
17500 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70  ){.      int nOp
17510 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  t = sqlite3Strle
17520 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20  n30(zOpt);.     
17530 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a   char *zVal = &z
17540 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20  Opt[nOpt+1];.   
17550 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71     int nVal = sq
17560 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56  lite3Strlen30(zV
17570 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  al);..      if( 
17580 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d  nOpt==3 && memcm
17590 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33  p("vfs", zOpt, 3
175a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
175b0 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20  zVfs = zVal;.   
175c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
175d0 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64    struct OpenMod
175e0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  e {.          co
175f0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
17600 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b         int mode;
17610 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64  .        } *aMod
17620 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
17630 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d  har *zModeType =
17640 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
17650 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  mask = 0;.      
17660 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b    int limit = 0;
17670 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  ..        if( nO
17680 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  pt==5 && memcmp(
17690 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35  "cache", zOpt, 5
176a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
176b0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
176c0 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d  OpenMode aCacheM
176d0 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
176e0 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22        { "shared"
176f0 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ,  SQLITE_OPEN_S
17700 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
17710 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69            { "pri
17720 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50  vate", SQLITE_OP
17730 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
17740 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
17750 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
17760 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
17770 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
17780 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53  EN_SHAREDCACHE|S
17790 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
177a0 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20  TECACHE;.       
177b0 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68     aMode = aCach
177c0 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  eMode;.         
177d0 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20   limit = mask;. 
177e0 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
177f0 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20  pe = "cache";.  
17800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17810 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d  if( nOpt==4 && m
17820 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f  emcmp("mode", zO
17830 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 4)==0 ){.   
17840 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
17850 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f  ruct OpenMode aO
17860 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  penMode[] = {.  
17870 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22            { "ro"
17880 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
17890 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20  EADONLY },.     
178a0 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20         { "rw",  
178b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
178c0 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20  WRITE }, .      
178d0 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53        { "rwc", S
178e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
178f0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
17900 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20  EN_CREATE },.   
17910 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f           { "memo
17920 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ry", SQLITE_OPEN
17930 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20  _MEMORY },.     
17940 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
17950 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
17960 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
17970 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17980 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  NLY | SQLITE_OPE
17990 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20  N_READWRITE.    
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
179b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
179c0 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
179d0 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20  N_MEMORY;.      
179e0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65      aMode = aOpe
179f0 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  nMode;.         
17a00 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20   limit = mask & 
17a10 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
17a20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63   zModeType = "ac
17a30 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d  cess";.        }
17a40 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d  ..        if( aM
17a50 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
17a60 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
17a70 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a    int mode = 0;.
17a80 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
17a90 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69  0; aMode[i].z; i
17aa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
17ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
17ac0 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20   aMode[i].z;.   
17ad0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61           if( nVa
17ae0 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  l==sqlite3Strlen
17af0 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63  30(z) && 0==memc
17b00 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c  mp(zVal, z, nVal
17b10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
17b20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b     mode = aMode[
17b30 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  i].mode;.       
17b40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17b50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17b70 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b    if( mode==0 ){
17b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
17b90 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
17ba0 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
17bb0 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20  h %s mode: %s", 
17bc0 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29  zModeType, zVal)
17bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
17be0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
17bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
17c00 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
17c10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17c20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65         if( (mode
17c30 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
17c40 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b  MEMORY)>limit ){
17c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a  .            *pz
17c60 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
17c70 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64  _mprintf("%s mod
17c80 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25  e not allowed: %
17c90 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64              zMod
17cc0 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
17cd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
17ce0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
17cf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
17d00 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
17d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17d20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73    flags = (flags
17d30 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65   & ~mask) | mode
17d40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17d50 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20    }..      zOpt 
17d60 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b  = &zVal[nVal+1];
17d70 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
17d80 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
17d90 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55  ite3_malloc64(nU
17da0 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21  ri+2);.    if( !
17db0 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
17dc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
17dd0 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
17de0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  {.      memcpy(z
17df0 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69  File, zUri, nUri
17e00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69  );.    }.    zFi
17e10 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
17e20 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
17e30 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  1] = '\0';.    f
17e40 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
17e50 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20  OPEN_URI;.  }.. 
17e60 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
17e70 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
17e80 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
17e90 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
17ea0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
17eb0 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
17ec0 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
17ed0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
17ee0 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
17ef0 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
17f00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17f20 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
17f30 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
17f40 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
17f50 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
17f60 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
17f70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
17f80 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17f90 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
17fa0 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
17fb0 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
17fc0 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
17fd0 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
17fe0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
17ff0 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
18000 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
18010 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
18020 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
18030 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
18040 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
18050 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
18060 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
18070 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
18080 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
18090 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
180a0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
180b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
180c0 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
180d0 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
180e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
180f0 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
18100 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
18110 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
18120 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18140 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
18150 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
18160 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
18190 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
181a0 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
181b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
181c0 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
181d0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
181e0 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18200 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
18210 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
18220 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
18230 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18250 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
18260 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
18270 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66  Uri() */..#ifdef
18280 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
18290 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
182a0 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
182b0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
182c0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
182d0 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
182e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
182f0 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
18300 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
18310 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
18320 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
18330 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
18340 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
18350 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
18360 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
18370 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
18380 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
18390 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
183a0 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
183b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
183c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
183d0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
183e0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
183f0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
18400 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
18410 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18420 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
18430 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67  .  }..  if( flag
18440 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
18450 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
18460 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
18470 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
18480 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
18490 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
184a0 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
184b0 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
184c0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
184d0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
184e0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
184f0 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
18500 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
18510 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
18520 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
18530 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
18540 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
18550 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
18560 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
18570 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
18580 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
18590 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
185a0 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
185b0 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
185c0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
185d0 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
185e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
185f0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
18600 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
18610 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
18620 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
18630 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
18640 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
18650 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
18660 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
18670 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
18680 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
18690 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
186a0 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
186b0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
186c0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
186d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
186e0 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
186f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18700 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
18710 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
18720 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
18730 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
18740 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18750 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
18760 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
18770 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
18780 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
187a0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
187b0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
187c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
187d0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
187e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
187f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
18800 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18820 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
18830 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
18840 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
18850 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
18860 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18870 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
18880 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
18890 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
188a0 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
188b0 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
188c0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
188d0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
188e0 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
188f0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18900 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
18910 61 66 65 20 0a 23 69 66 64 65 66 20 53 51 4c 49  afe .#ifdef SQLI
18920 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 54  TE_ENABLE_MULTIT
18930 48 52 45 41 44 45 44 5f 43 48 45 43 4b 53 0a 20  HREADED_CHECKS. 
18940 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
18950 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
18960 74 65 78 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  tex.#endif.  ){.
18970 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
18980 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
18990 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
189a0 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
189b0 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
189c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
189d0 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
189e0 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
189f0 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
18a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
18a10 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 29 7b  Threadsafe==0 ){
18a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75  .      sqlite3Mu
18a30 74 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65 6e 74  texWarnOnContent
18a40 69 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ion(db->mutex);.
18a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18a60 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
18a70 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
18a80 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
18a90 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
18aa0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
18ab0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
18ac0 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
18ad0 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 64  ->aDbStatic;.  d
18ae0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
18af0 73 61 62 6c 65 20 3d 20 31 3b 0a 0a 20 20 61 73  sable = 1;..  as
18b00 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d  sert( sizeof(db-
18b10 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66  >aLimit)==sizeof
18b20 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a  (aHardLimit) );.
18b30 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69    memcpy(db->aLi
18b40 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c  mit, aHardLimit,
18b50 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
18b60 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d  it));.  db->aLim
18b70 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
18b80 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20  WORKER_THREADS] 
18b90 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
18ba0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b  _WORKER_THREADS;
18bb0 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
18bc0 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
18bd0 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
18be0 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71   db->szMmap = sq
18bf0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18c00 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e  g.szMmap;.  db->
18c10 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30  nextPagesize = 0
18c20 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74  ;.  db->nMaxSort
18c30 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46  erMmap = 0x7FFFF
18c40 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  FFF;.  db->flags
18c50 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
18c60 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54  ColNames | SQLIT
18c70 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20  E_EnableTrigger 
18c80 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70  | SQLITE_CacheSp
18c90 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ill.#if !defined
18ca0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
18cb0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29  AUTOMATIC_INDEX)
18cc0 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   || SQLITE_DEFAU
18cd0 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  LT_AUTOMATIC_IND
18ce0 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
18cf0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74      | SQLITE_Aut
18d00 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69  oIndex.#endif.#i
18d10 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
18d20 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20  _CKPTFULLFSYNC. 
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c  | SQLITE_CkptFul
18d50 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69  lFSync.#endif.#i
18d60 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
18d70 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
18da0 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
18db0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18dc0 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
18dd0 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
18de0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
18df0 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
18e00 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
18e10 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52  ULT_RECURSIVE_TR
18e20 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20  IGGERS.         
18e30 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
18e40 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e  _RecTriggers.#en
18e50 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
18e60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
18e70 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20  OREIGN_KEYS) && 
18e80 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
18e90 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20  OREIGN_KEYS.    
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
18eb0 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
18ec0 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
18ed0 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45  ined(SQLITE_REVE
18ee0 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45  RSE_UNORDERED_SE
18ef0 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20  LECTS).         
18f00 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
18f10 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65  _ReverseOrder.#e
18f20 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
18f30 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
18f40 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
18f50 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK).            
18f60 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65       | SQLITE_Ce
18f70 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a  llSizeCk.#endif.
18f80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18f90 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  TE_ENABLE_FTS3_T
18fa0 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20  OKENIZER).      
18fb0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
18fc0 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65  ITE_Fts3Tokenize
18fd0 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
18fe0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18ff0 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20 20  LE_QPSG).       
19000 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19010 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23 65  TE_EnableQPSG.#e
19020 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
19030 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
19040 44 45 46 45 4e 53 49 56 45 29 0a 20 20 20 20 20  DEFENSIVE).     
19050 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19060 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 0a 23  LITE_Defensive.#
19070 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
19080 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
19090 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
190a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
190b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
190c0 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
190d0 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
190e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
190f0 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
19100 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19110 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
19120 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
19130 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
19140 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
19150 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
19160 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
19170 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
19180 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
19190 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
191a0 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
191b0 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
191c0 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lure..  **.  ** 
191d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
191e0 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74  2786-44878 SQLit
191f0 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20  e defines three 
19200 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
19210 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
19220 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  s:.  */.  create
19230 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
19240 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
19250 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
19260 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
19270 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
19280 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
19290 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
192a0 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
192b0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
192c0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
192d0 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
192e0 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
192f0 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
19300 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
19310 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
19320 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
19330 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
19340 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
19350 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
19360 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
19370 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
19380 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
19390 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
193a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
193b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
193c0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a  db_out;.  }.  /*
193d0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
193e0 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20  08308-17224 The 
193f0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
19400 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  g function for a
19410 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  ll.  ** strings 
19420 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f  is BINARY. .  */
19430 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
19440 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
19450 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
19460 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74  _UTF8, sqlite3St
19470 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61  rBINARY, 0);.  a
19480 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
19490 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
194a0 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
194b0 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
194c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20  .  **.  ** Only 
194d0 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
194e0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
194f0 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
19500 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
19510 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
19520 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
19530 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
19540 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
19550 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
19560 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
19570 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
19580 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
19590 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
195a0 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
195b0 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
195c0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
195d0 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
195e0 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
195f0 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
19600 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
19610 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
19620 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
19630 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
19640 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19650 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  .  */.  db->open
19660 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
19670 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
19680 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
19690 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
196a0 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
196b0 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
196c0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
196d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
196e0 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
196f0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
19700 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
19710 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
19720 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
19730 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
19740 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
19750 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
19760 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
19770 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
19780 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
19790 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
197a0 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
197b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
197c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
197d0 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  KPT;  /* IMP: R-
197e0 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20  65497-44594 */. 
197f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
19800 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
19810 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
19820 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
19830 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
19840 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66  rrMsg);.  }.  if
19850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19860 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
19870 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71  QLITE_NOMEM ) sq
19880 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
19890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  );.    sqlite3Er
198a0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
198b0 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
198c0 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
198d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
198e0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
198f0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
19900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
19910 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
19920 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
19930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19940 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
19950 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
19960 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19980 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
19990 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
199a0 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
199b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
199c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
199d0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
199e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
199f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
19a00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
19a10 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20  ror(db, rc);.   
19a20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19a30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
19a40 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44  treeEnter(db->aD
19a50 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
19a60 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
19a70 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
19a80 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
19a90 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64  ].pBt);.  if( !d
19aa0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19ab0 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45  ) ENC(db) = SCHE
19ac0 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71  MA_ENC(db);.  sq
19ad0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19ae0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
19af0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
19b00 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
19b10 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
19b20 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
19b30 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
19b40 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
19b50 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66  abase is FULL; f
19b60 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
19b70 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
19b80 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65  OFF. This matche
19b90 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
19ba0 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
19bb0 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
19bc0 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  zDbSName = "main
19bd0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
19be0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53  safety_level = S
19bf0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
19c00 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64  NCHRONOUS+1;.  d
19c10 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61  b->aDb[1].zDbSNa
19c20 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
19c30 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
19c40 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53  _level = PAGER_S
19c50 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a  YNCHRONOUS_OFF;.
19c60 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
19c70 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
19c80 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
19c90 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19ca0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
19cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
19cc0 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
19cd0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
19ce0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
19cf0 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
19d00 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
19d10 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
19d20 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
19d30 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
19d40 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
19d50 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
19d60 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
19d70 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
19d80 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65  qlite3RegisterPe
19d90 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74  rConnectionBuilt
19da0 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
19db0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19dc0 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69  errcode(db);..#i
19dd0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19de0 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67  LE_FTS5.  /* Reg
19df0 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d  ister any built-
19e00 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62  in FTS5 module b
19e10 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68  efore loading th
19e20 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a  e automatic.  **
19e30 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69   extensions. Thi
19e40 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74  s allows automat
19e50 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f  ic extensions to
19e60 20 72 65 67 69 73 74 65 72 20 46 54 53 35 20 0a   register FTS5 .
19e70 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20    ** tokenizers 
19e80 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66 75  and auxiliary fu
19e90 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69  nctions.  */.  i
19ea0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19eb0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
19ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
19ed0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69  = sqlite3Fts5Ini
19ee0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
19ef0 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  f..  /* Load aut
19f00 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
19f10 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
19f20 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
19f30 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
19f40 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
19f50 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
19f60 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
19f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
19f90 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
19fa0 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
19fb0 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
19fc0 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
19fd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19fe0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
19ff0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
1a000 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1a010 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
1a020 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a030 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
1a040 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
1a050 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
1a060 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a070 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
1a080 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
1a090 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a0a0 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
1a0b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
1a0c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a0d0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
1a0e0 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
1a0f0 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
1a100 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
1a110 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a120 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1a130 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20  ITE_ENABLE_FTS3 
1a140 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  /* automatically
1a150 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49   defined by SQLI
1a160 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a  TE_ENABLE_FTS4 *
1a170 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  /.  if( !db->mal
1a180 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1a190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a1a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1a1b0 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
1a1c0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1a1d0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1a1e0 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69 6e 65  E_ICU) || define
1a1f0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a200 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53 29 0a  ICU_COLLATIONS).
1a210 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a220 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a240 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
1a250 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1a260 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a270 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
1a280 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
1a290 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
1a2a0 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
1a2b0 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
1a2c0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a2d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1a2e0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
1a2f0 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62  E_VTAB.  if( !db
1a300 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
1a310 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
1a320 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a330 65 33 44 62 70 61 67 65 52 65 67 69 73 74 65 72  e3DbpageRegister
1a340 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
1a350 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a360 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54  ENABLE_DBSTAT_VT
1a370 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  AB.  if( !db->ma
1a380 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
1a390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
1a3a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62    rc = sqlite3Db
1a3b0 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29  statRegister(db)
1a3c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1a3d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a3e0 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21  LE_JSON1.  if( !
1a3f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a400 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1a410 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1a420 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62  ite3Json1Init(db
1a430 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
1a440 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a450 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20 20 69  BLE_STMTVTAB.  i
1a460 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
1a470 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
1a480 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
1a490 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62   sqlite3StmtVtab
1a4a0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
1a4b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
1a4c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
1a4d0 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
1a4e0 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
1a4f0 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
1a500 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
1a510 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
1a520 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
1a530 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
1a540 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
1a550 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
1a560 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
1a570 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
1a580 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
1a590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1a5a0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
1a5b0 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
1a5c0 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
1a5d0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
1a5e0 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
1a5f0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
1a600 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1a610 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
1a620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a630 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1a640 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
1a650 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
1a660 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c  ..  if( rc ) sql
1a670 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
1a680 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  );..  /* Enable 
1a690 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
1a6a0 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
1a6b0 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
1a6c0 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
1a6d0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1a6e0 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a710 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
1a720 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
1a730 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
1a740 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
1a750 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
1a760 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
1a770 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20  b_out:.  if( db 
1a780 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
1a790 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69  b->mutex!=0 || i
1a7a0 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20  sThreadsafe==0. 
1a7b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
1a7c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a7d0 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
1a7e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1a7f0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1a800 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
1a810 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1a820 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
1a830 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  db!=0 || rc==SQL
1a840 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69  ITE_NOMEM );.  i
1a850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1a860 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
1a870 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
1a880 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
1a890 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
1a8a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
1a8b0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1a8c0 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20  GIC_SICK;.  }.  
1a8d0 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64  *ppDb = db;.#ifd
1a8e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a8f0 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71  _SQLLOG.  if( sq
1a900 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a910 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20  g.xSqllog ){.   
1a920 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62   /* Opening a db
1a930 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
1a940 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
1a950 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f  sed 0. */.    vo
1a960 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74  id *pArg = sqlit
1a970 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a980 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73  SqllogArg;.    s
1a990 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1a9a0 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c  ig.xSqllog(pArg,
1a9b0 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   db, zFilename, 
1a9c0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  0);.  }.#endif.#
1a9d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a9e0 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69  E_HAS_CODEC).  i
1a9f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aa00 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1aa10 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66  ar *zKey;.    if
1aa20 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65  ( (zKey = sqlite
1aa30 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1aa40 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29  zOpen, "hexkey")
1aa50 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20  )!=0 && zKey[0] 
1aa60 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74  ){.      u8 iByt
1aa70 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e;.      int i;.
1aa80 20 20 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f        char zDeco
1aa90 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  ded[40];.      f
1aaa0 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
1aab0 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64   i<sizeof(zDecod
1aac0 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ed)*2 && sqlite3
1aad0 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d  Isxdigit(zKey[i]
1aae0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
1aaf0 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
1ab00 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
1ab10 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a  ToInt(zKey[i]);.
1ab20 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
1ab30 29 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b  )!=0 ) zDecoded[
1ab40 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20  i/2] = iByte;.  
1ab50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ab60 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30  te3_key_v2(db, 0
1ab70 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29  , zDecoded, i/2)
1ab80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ab90 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
1aba0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
1abb0 70 65 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20  pen, "key"))!=0 
1abc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1abd0 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a  _key_v2(db, 0, z
1abe0 4b 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  Key, sqlite3Strl
1abf0 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20  en30(zKey));.   
1ac00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
1ac10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
1ac20 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  en);.  return rc
1ac30 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
1ac40 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
1ac50 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
1ac60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1ac70 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
1ac80 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
1ac90 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
1aca0 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
1acb0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
1acc0 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1ace0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1acf0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1ad00 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
1ad10 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1ad20 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
1ad30 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
1ad40 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1ad50 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
1ad60 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
1ad70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1ad80 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
1ad90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
1ada0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1adb0 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
1adc0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
1add0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ade0 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
1adf0 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
1ae00 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
1ae10 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
1ae20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
1ae30 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
1ae40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae50 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
1ae60 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
1ae70 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
1ae80 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
1ae90 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1aea0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
1aeb0 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
1aec0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
1aed0 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
1aee0 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
1aef0 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
1af00 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
1af10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1af20 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
1af30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1af40 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1af50 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
1af60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1af70 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1af80 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
1af90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1afa0 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
1afb0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
1afc0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
1afd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
1afe0 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65  ndif.  if( zFile
1aff0 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e  name==0 ) zFilen
1b000 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22  ame = "\000\000"
1b010 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
1b020 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
1b030 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
1b040 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
1b050 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
1b060 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
1b070 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
1b080 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
1b090 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
1b0a0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
1b0b0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1b0c0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
1b0d0 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
1b0e0 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1b110 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
1b120 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
1b130 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
1b140 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
1b150 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
1b160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b170 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
1b180 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
1b190 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
1b1a0 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45  {.      SCHEMA_E
1b1b0 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28  NC(*ppDb) = ENC(
1b1c0 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
1b1d0 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
1b1e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1b1f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1b200 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  M_BKPT;.  }.  sq
1b210 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
1b220 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
1b230 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e  rc & 0xff;.}.#en
1b240 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1b250 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
1b260 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
1b270 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
1b280 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
1b290 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
1b2a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b2b0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1b2c0 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
1b2d0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1b2e0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
1b2f0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1b300 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1b310 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1b320 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1b330 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1b340 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
1b350 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
1b360 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e  v2(db, zName, en
1b370 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
1b380 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, 0);.}../*.** 
1b390 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
1b3a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b3b0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
1b3c0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
1b3d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
1b3e0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1b3f0 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  2(.  sqlite3* db
1b400 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1b410 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
1b420 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1b430 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1b440 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1b450 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1b460 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
1b470 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
1b480 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
1b490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b4a0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1b4b0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1b4c0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1b4d0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
1b4e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1b4f0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1b500 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1b510 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1b520 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
1b530 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1b540 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
1b550 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
1b560 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
1b570 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
1b580 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1b590 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1b5a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b5b0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1b5c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b5d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b5e0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1b5f0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1b600 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1b610 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1b620 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1b630 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b640 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1b650 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
1b660 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
1b670 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
1b680 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1b690 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1b6a0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1b6b0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1b6c0 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1b6d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b6e0 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
1b6f0 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e8;..#ifdef SQLI
1b700 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1b710 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1b720 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1b730 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
1b740 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b750 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1b760 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1b770 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1b780 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1b790 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1b7a0 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
1b7b0 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
1b7c0 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
1b7d0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
1b7e0 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
1b7f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
1b800 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
1b810 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
1b820 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1b830 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1b840 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1b850 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
1b860 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1b870 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1b880 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b890 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b8a0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1b8b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1b8c0 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
1b8d0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
1b8e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1b8f0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
1b900 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1b910 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
1b920 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
1b930 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
1b940 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b950 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
1b960 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
1b970 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
1b980 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
1b990 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
1b9a0 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
1b9b0 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
1b9c0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
1b9d0 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
1b9e0 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
1b9f0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1ba00 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1ba10 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1ba20 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1ba30 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1ba40 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1ba50 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1ba60 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1ba70 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
1ba80 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
1ba90 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1baa0 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
1bab0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1bac0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1bad0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1bae0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1baf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bb00 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1bb10 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
1bb20 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1bb30 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1bb40 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
1bb50 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
1bb60 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
1bb70 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
1bb80 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
1bb90 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
1bba0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
1bbb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1bbc0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1bbd0 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
1bbe0 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
1bbf0 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
1bc00 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
1bc10 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
1bc20 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
1bc30 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1bc40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1bc50 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1bc60 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1bc70 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1bc80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1bc90 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1bca0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1bcb0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1bcc0 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
1bcd0 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62  Needed = 0;.  db
1bce0 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1bcf0 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b  = xCollNeeded16;
1bd00 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
1bd10 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
1bd20 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
1bd30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1bd40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1bd50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1bd60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1bd70 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1bd80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bd90 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
1bda0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bdb0 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61  on is now an ana
1bdc0 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65  chronism. It use
1bdd0 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20  d to be used to 
1bde0 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a  recover from a.*
1bdf0 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  * malloc() failu
1be00 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e  re, but SQLite n
1be10 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74  ow does this aut
1be20 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69  omatically..*/.i
1be30 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  nt sqlite3_globa
1be40 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b  l_recover(void){
1be50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1be60 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
1be70 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65  *.** Test to see
1be80 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1be90 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1bea0 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75  nection is in au
1beb0 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65  tocommit.** mode
1bec0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1bed0 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53  f it is and FALS
1bee0 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63  E if not.  Autoc
1bef0 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e  ommit mode is on
1bf00 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20  .** by default. 
1bf10 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64   Autocommit is d
1bf20 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47  isabled by a BEG
1bf30 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  IN statement and
1bf40 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79   reenabled.** by
1bf50 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54   the next COMMIT
1bf60 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f   or ROLLBACK..*/
1bf70 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
1bf80 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
1bf90 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
1bfa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1bfb0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1bfc0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1bfd0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1bfe0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1bff0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1c000 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1c010 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
1c020 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f  autoCommit;.}../
1c030 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1c040 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
1c050 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20  substitutes for 
1c060 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
1c070 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
1c080 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
1c090 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
1c0a0 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f  ITE_NOMEM and po
1c0b0 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
1c0c0 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
1c0d0 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f    They serve two
1c0e0 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a   purposes:.**.**
1c0f0 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20     1.  Serve as 
1c100 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1c110 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1c120 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75  kpoint in a debu
1c130 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f  gger.**       to
1c140 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72   detect when ver
1c150 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  sion error condi
1c160 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a  tions occurs..**
1c170 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65  .**   2.  Invoke
1c180 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74   sqlite3_log() t
1c190 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f  o provide the so
1c1a0 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69  urce code locati
1c1b0 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20  on where.**     
1c1c0 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72    a low-level er
1c1d0 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74  ror is first det
1c1e0 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ected..*/.int sq
1c1f0 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72  lite3ReportError
1c200 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c  (int iErr, int l
1c210 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61  ineno, const cha
1c220 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c  r *zType){.  sql
1c230 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22  ite3_log(iErr, "
1c240 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  %s at line %d of
1c250 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
1c260 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20           zType, 
1c270 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
1c280 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
1c290 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d    return iErr;.}
1c2a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
1c2b0 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
1c2c0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1c2d0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1c2e0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1c2f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c300 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c  3ReportError(SQL
1c310 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e  ITE_CORRUPT, lin
1c320 65 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63  eno, "database c
1c330 6f 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69  orruption");.}.i
1c340 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
1c350 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1c360 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1c370 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1c380 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1c390 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
1c3a0 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1c3b0 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c  _MISUSE, lineno,
1c3c0 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e   "misuse");.}.in
1c3d0 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
1c3e0 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
1c3f0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1c400 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c410 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1c420 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
1c430 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1c440 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65  E_CANTOPEN, line
1c450 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  no, "cannot open
1c460 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65   file");.}.#ifde
1c470 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
1c480 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1c490 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c  tPgnoError(int l
1c4a0 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f  ineno, Pgno pgno
1c4b0 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31  ){.  char zMsg[1
1c4c0 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
1c4d0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1c4e0 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74  Msg), zMsg, "dat
1c4f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1c500 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29   page %d", pgno)
1c510 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  ;.  testcase( sq
1c520 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1c530 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1c540 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1c550 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1c560 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c  CORRUPT, lineno,
1c570 20 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71   zMsg);.}.int sq
1c580 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28  lite3NomemError(
1c590 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1c5a0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1c5b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1c5c0 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1c5d0 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72   sqlite3ReportEr
1c5e0 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ror(SQLITE_NOMEM
1c5f0 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29  , lineno, "OOM")
1c600 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  ;.}.int sqlite3I
1c610 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69  oerrnomemError(i
1c620 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1c630 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1c640 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1c650 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1c660 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1c670 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1c680 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22  NOMEM, lineno, "
1c690 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b  I/O OOM error");
1c6a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
1c6b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1c6c0 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
1c6d0 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
1c6e0 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
1c6f0 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
1c700 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
1c710 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
1c720 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
1c730 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
1c740 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
1c750 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
1c760 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
1c770 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
1c780 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
1c790 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
1c7a0 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
1c7b0 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
1c7c0 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
1c7d0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
1c7e0 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
1c7f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1c800 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
1c810 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
1c820 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
1c830 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
1c840 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
1c850 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
1c860 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
1c870 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  details..*/.int 
1c880 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
1c890 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
1c8a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8c0 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
1c8d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1c8e0 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
1c8f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
1c900 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
1c910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1c920 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
1c930 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
1c940 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1c950 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
1c960 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1c970 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
1c980 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
1c990 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
1c9a0 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
1c9b0 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
1c9c0 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
1c9d0 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
1c9e0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
1c9f0 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
1ca00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ca10 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1ca20 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
1ca30 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
1ca40 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
1ca50 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
1ca60 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1ca70 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
1ca80 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
1ca90 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
1caa0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1cab0 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
1cac0 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
1cad0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1cae0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1caf0 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
1cb00 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
1cb10 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
1cb20 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68  t iCol = 0;.  ch
1cb30 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
1cb40 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
1cb50 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
1cb60 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
1cb70 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
1cb80 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
1cb90 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
1cba0 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
1cbb0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1cbc0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1cbd0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1cbe0 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d  ) || zTableName=
1cbf0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1cc00 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1cc10 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
1cc20 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
1cc30 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1cc40 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
1cc50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1cc60 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1cc70 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
1cc80 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
1cc90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1cca0 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
1ccb0 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
1ccc0 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
1ccd0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1cce0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
1ccf0 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
1cd00 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
1cd10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
1cd20 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
1cd30 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
1cd40 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
1cd50 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1cd60 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
1cd70 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1cd80 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
1cd90 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
1cda0 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
1cdb0 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43  sted */.  if( zC
1cdc0 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a  olumnName==0 ){.
1cdd0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
1cde0 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61   existance of ta
1cdf0 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65  ble only */.  }e
1ce00 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
1ce10 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
1ce20 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1ce30 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
1ce40 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
1ce50 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
1ce60 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
1ce70 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
1ce80 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1ce90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cea0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
1ceb0 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
1cec0 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
1ced0 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c  wid(pTab) && sql
1cee0 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
1cef0 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1cf00 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
1cf10 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
1cf20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  pCol = iCol>=0 ?
1cf30 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1cf40 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65  l] : 0;.      }e
1cf50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
1cf60 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  b = 0;.        g
1cf70 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1cf80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cf90 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1cfa0 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
1cfb0 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
1cfc0 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
1cfd0 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
1cfe0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
1cff0 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
1d000 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
1d010 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
1d020 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
1d030 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
1d040 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
1d050 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
1d060 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
1d070 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
1d080 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
1d090 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
1d0a0 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
1d0b0 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
1d0c0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1d0d0 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
1d0e0 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
1d0f0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
1d100 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
1d110 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
1d120 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
1d130 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
1d140 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
1d150 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
1d160 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
1d170 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1d180 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
1d190 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
1d1a0 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69  zDataType = sqli
1d1b0 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
1d1c0 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ol,0);.    zColl
1d1d0 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
1d1e0 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
1d1f0 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
1d200 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
1d210 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46  y  = (pCol->colF
1d220 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
1d230 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20  RIMKEY)!=0;.    
1d240 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
1d250 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
1d260 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1d270 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
1d280 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
1d290 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1d2a0 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
1d2b0 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
1d2c0 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
1d2d0 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
1d2e0 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  eq = sqlite3StrB
1d2f0 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f  INARY;.  }..erro
1d300 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1d310 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
1d320 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
1d330 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
1d340 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
1d350 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
1d360 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1d370 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
1d380 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
1d390 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
1d3a0 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
1d3b0 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
1d3c0 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
1d3d0 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
1d3e0 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
1d3f0 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
1d400 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
1d410 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
1d420 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
1d430 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
1d440 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
1d450 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
1d460 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
1d470 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
1d480 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
1d490 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
1d4a0 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
1d4b0 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
1d4c0 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
1d4d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1d4e0 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
1d4f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d500 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
1d510 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
1d520 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1d530 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
1d540 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
1d550 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
1d560 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
1d570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1d580 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1d590 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
1d5a0 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
1d5b0 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
1d5c0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1d5d0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1d5e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d5f0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1d600 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1d610 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1d620 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d630 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
1d640 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1d650 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1d660 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1d670 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
1d680 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
1d690 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1d6a0 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
1d6b0 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
1d6c0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1d6d0 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
1d6e0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
1d6f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
1d700 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
1d710 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
1d720 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
1d730 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
1d740 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
1d750 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
1d760 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
1d770 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
1d780 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
1d790 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
1d7b0 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
1d7c0 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
1d7d0 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
1d7e0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
1d7f0 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
1d800 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
1d810 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f){.#ifdef SQLIT
1d820 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1d830 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1d840 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1d850 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1d860 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1d870 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1d880 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1d890 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
1d8a0 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
1d8b0 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
1d8c0 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
1d8d0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1d8e0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1d8f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d900 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
1d910 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
1d920 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
1d930 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
1d940 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
1d950 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
1d960 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1d970 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
1d980 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1d990 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d9a0 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
1d9b0 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66  *pBtree;..#ifdef
1d9c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1d9d0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1d9e0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1d9f0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1da00 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1da10 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1da20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1da30 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1da40 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
1da50 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1da60 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
1da70 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1da80 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1da90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1daa0 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
1dab0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1dac0 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
1dad0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
1dae0 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
1daf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1db00 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
1db10 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
1db20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
1db30 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
1db40 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1db50 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
1db60 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1db70 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1db80 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
1db90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1dba0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1dbb0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46  =SQLITE_FCNTL_VF
1dbc0 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  S_POINTER ){.   
1dbd0 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73     *(sqlite3_vfs
1dbe0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1dbf0 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65 72  3PagerVfs(pPager
1dc00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1dc10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1dc20 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1dc30 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f  E_FCNTL_JOURNAL_
1dc40 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1dc50 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
1dc60 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1dc70 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50  PagerJrnlFile(pP
1dc80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1dc90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1dca0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53   }else if( op==S
1dcb0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41  QLITE_FCNTL_DATA
1dcc0 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  _VERSION ){.    
1dcd0 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
1dce0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1dcf0 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
1dd00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1dd10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1dd20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dd30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1dd40 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
1dd50 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a  p, pArg);.    }.
1dd60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1dd70 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1dd80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1dd90 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1dda0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1ddb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
1ddc0 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73 74  face to the test
1ddd0 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e  ing logic..*/.in
1dde0 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  t sqlite3_test_c
1ddf0 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e  ontrol(int op, .
1de00 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ..){.  int rc = 
1de10 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1de20 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 55 4e  _UNTESTABLE.  UN
1de30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f  USED_PARAMETER(o
1de40 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c  p);.#else.  va_l
1de50 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1de60 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
1de70 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
1de80 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
1de90 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1dea0 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
1deb0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1dec0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1ded0 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
1dee0 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
1def0 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1df00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1df10 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
1df20 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
1df30 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1df40 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
1df50 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
1df60 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
1df70 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
1df80 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
1df90 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
1dfa0 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
1dfb0 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
1dfc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1dfd0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1dfe0 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
1dff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1e000 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1e010 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e020 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1e030 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
1e040 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
1e050 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
1e060 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
1e070 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
1e080 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1e090 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
1e0a0 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
1e0b0 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
1e0c0 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
1e0d0 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
1e0e0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
1e0f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1e100 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1e110 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
1e120 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1e130 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
1e140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e150 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1e160 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e170 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
1e180 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
1e190 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1e1a0 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
1e1b0 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
1e1c0 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
1e1d0 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
1e1e0 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
1e1f0 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1e200 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1e210 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
1e220 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
1e230 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1e240 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
1e250 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
1e260 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
1e270 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
1e280 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1e290 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
1e2a0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1e2b0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1e2c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e2d0 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
1e2e0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
1e2f0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1e300 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
1e310 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
1e320 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
1e330 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1e340 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
1e350 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
1e360 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e370 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1e380 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e390 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
1e3a0 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
1e3b0 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
1e3c0 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
1e3d0 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
1e3e0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1e3f0 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
1e400 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
1e410 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
1e420 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
1e430 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
1e440 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
1e450 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
1e460 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1e470 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
1e480 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
1e490 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
1e4a0 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
1e4b0 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
1e4c0 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
1e4d0 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
1e4e0 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
1e4f0 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
1e500 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
1e510 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
1e520 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e530 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
1e540 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
1e550 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
1e560 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
1e570 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
1e580 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
1e590 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
1e5a0 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
1e5b0 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
1e5c0 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
1e5d0 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1e5e0 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1e5f0 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
1e600 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e610 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
1e620 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1e630 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
1e640 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e650 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1e660 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
1e670 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
1e680 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e690 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
1e6a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e6b0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1e6c0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1e6d0 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
1e6e0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
1e6f0 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
1e700 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
1e710 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
1e720 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
1e730 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
1e740 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
1e750 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
1e760 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e770 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
1e780 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
1e790 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1e7a0 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
1e7b0 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
1e7c0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1e7d0 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
1e7e0 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1e7f0 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
1e800 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
1e810 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1e820 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1e830 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
1e840 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1e850 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1e860 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
1e870 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
1e880 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
1e890 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
1e8a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1e8b0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1e8c0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1e8d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1e8e0 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
1e8f0 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
1e900 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1e910 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
1e920 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1e930 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
1e940 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
1e950 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
1e960 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
1e970 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
1e980 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
1e990 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
1e9a0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1e9b0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
1e9c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
1e9d0 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
1e9e0 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1e9f0 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
1ea00 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
1ea10 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
1ea20 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
1ea30 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
1ea40 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1ea50 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1ea60 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1ea70 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1ea80 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1ea90 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1eaa0 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62  ** deleterious b
1eab0 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1eac0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ead0 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1eae0 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1eaf0 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1eb00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1eb10 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1eb20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1eb30 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1eb40 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1eb50 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1eb60 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1eb70 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1eb80 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1eb90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1eba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ebb0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1ebc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1ebd0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1ebe0 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1ebf0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1ec00 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1ec10 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1ec20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1ec30 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1ec40 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1ec50 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1ec60 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1ec70 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1ec80 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1ec90 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1eca0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1ecb0 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1ecc0 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1ecd0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1ece0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1ecf0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1ed00 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1ed10 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1ed20 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1ed30 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1ed40 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1ed50 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1ed60 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1ed70 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1ed80 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1ed90 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1eda0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1edb0 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1edc0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1edd0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1ede0 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1edf0 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1ee00 20 20 20 61 73 73 65 72 74 28 20 2f 2a 73 69 64     assert( /*sid
1ee10 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f 20 28  e-effects-ok*/ (
1ee20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1ee30 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  t))!=0 );.      
1ee40 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72  rc = x;.      br
1ee50 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1ee60 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1ee70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ee80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ee90 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a  _ALWAYS, int X).
1eea0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1eeb0 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1eec0 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1eed0 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68  st to see how th
1eee0 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20  e ALWAYS and.   
1eef0 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73   ** NEVER macros
1ef00 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74   were defined at
1ef10 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20   compile-time.. 
1ef20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ef30 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1ef40 20 41 4c 57 41 59 53 28 58 29 20 69 66 20 58 20   ALWAYS(X) if X 
1ef50 69 73 20 74 72 75 65 2c 20 6f 72 20 30 20 69 66  is true, or 0 if
1ef60 20 58 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   X is false..   
1ef70 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1ef80 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20  ecommended test 
1ef90 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65  is X==2.  If the
1efa0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1efb0 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20   2, that means. 
1efc0 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61     ** ALWAYS() a
1efd0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62  nd NEVER() are b
1efe0 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  oth no-op pass-t
1eff0 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77  hrough macros, w
1f000 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20  hich is the.    
1f010 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  ** default setti
1f020 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75  ng.  If the retu
1f030 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74  rn value is 1, t
1f040 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20  hen ALWAYS() is 
1f050 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61  either.    ** ha
1f060 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1f070 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65   or else it asse
1f080 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d  rts if its argum
1f090 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  ent is false..  
1f0a0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
1f0b0 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f  ehavior (hard-co
1f0c0 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20  ded to true) is 
1f0d0 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
1f0e0 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
1f0f0 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
1f100 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
1f110 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68   disabled and th
1f120 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
1f130 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74  behavior (assert
1f140 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1f150 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20   to ALWAYS() is 
1f160 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61  false) is the ca
1f170 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1f180 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1f190 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1f1a0 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1f1b0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1f1c0 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74  * The run-time t
1f1d0 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69  est procedure mi
1f1e0 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69  ght look somethi
1f1f0 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ng like this:.  
1f200 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69    **.    **    i
1f210 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
1f220 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1f230 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1f240 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20  2)==2 ){.    ** 
1f250 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29       // ALWAYS()
1f260 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
1f270 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1f280 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a  ugh macros.    *
1f290 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  *    }else if( s
1f2a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f2b0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f2c0 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29  TRL_ASSERT, 1) )
1f2d0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1f2e0 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72   ALWAYS(x) asser
1f2f0 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75  ts that x is tru
1f300 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65  e. NEVER(x) asse
1f310 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a  rts x is false..
1f320 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b      **    }else{
1f330 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1f340 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63  ALWAYS(x) is a c
1f350 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45  onstant 1.  NEVE
1f360 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61  R(x) is a consta
1f370 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20  nt 0..    **    
1f380 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  }.    */.    cas
1f390 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1f3a0 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20  L_ALWAYS: {.    
1f3b0 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1f3c0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1f3d0 72 63 20 3d 20 78 20 3f 20 41 4c 57 41 59 53 28  rc = x ? ALWAYS(
1f3e0 78 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  x) : 0;.      br
1f3f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1f400 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
1f410 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f420 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1f430 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
1f440 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
1f450 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
1f460 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
1f470 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
1f480 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
1f490 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
1f4a0 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
1f4b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
1f4c0 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1f4d0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1f4e0 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
1f4f0 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
1f500 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1f510 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1f520 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
1f530 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1f540 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1f550 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
1f560 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
1f570 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1f580 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1f590 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1f5a0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
1f5b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1f5c0 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
1f5d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
1f5e0 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
1f5f0 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
1f600 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
1f610 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
1f620 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1f630 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1f640 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1f650 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1f660 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
1f670 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1f680 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
1f690 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
1f6a0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
1f6b0 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
1f6c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
1f6d0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
1f6e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f6f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1f700 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
1f710 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1f720 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1f730 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1f740 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1f750 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1f760 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1f770 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
1f780 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1f790 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
1f7a0 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
1f7b0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1f7c0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1f7d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1f7e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1f7f0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1f800 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1f810 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1f820 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
1f830 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1f840 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
1f850 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
1f860 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
1f870 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
1f880 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
1f890 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
1f8a0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
1f8b0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
1f8c0 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
1f8d0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
1f8e0 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
1f8f0 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
1f900 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
1f910 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
1f920 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
1f930 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
1f940 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
1f950 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
1f960 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
1f970 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
1f980 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
1f990 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
1f9a0 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
1f9b0 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
1f9c0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
1f9d0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
1f9e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f9f0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1fa00 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
1fa10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1fa20 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1fa30 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
1fa40 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
1fa50 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
1fa60 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
1fa70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fa80 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1fa90 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1faa0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
1fab0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20  OCALTIME_FAULT, 
1fac0 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20  int onoff);.    
1fad0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72  **.    ** If par
1fae0 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20  ameter onoff is 
1faf0 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 75 62 73 65 71  non-zero, subseq
1fb00 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
1fb10 63 61 6c 74 69 6d 65 28 29 0a 20 20 20 20 2a 2a  caltime().    **
1fb20 20 61 6e 64 20 69 74 73 20 76 61 72 69 61 6e 74   and its variant
1fb30 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66  s fail. If onoff
1fb40 20 69 73 20 7a 65 72 6f 2c 20 75 6e 64 6f 20 74   is zero, undo t
1fb50 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1fb60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1fb70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1fb80 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1fb90 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1fba0 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1fbb0 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1fbc0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1fbd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fbe0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1fbf0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1fc00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1fc10 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 53 2c 20 69  NTERNAL_FUNCS, i
1fc20 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a  nt onoff);.    *
1fc30 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61  *.    ** If para
1fc40 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e  meter onoff is n
1fc50 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 74 65 72 6e 61  on-zero, interna
1fc60 6c 2d 75 73 65 2d 6f 6e 6c 79 20 53 51 4c 20 66  l-use-only SQL f
1fc70 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  unctions.    ** 
1fc80 61 72 65 20 76 69 73 69 62 6c 65 20 74 6f 20 6f  are visible to o
1fc90 72 64 69 6e 61 72 79 20 53 51 4c 2e 20 20 54 68  rdinary SQL.  Th
1fca0 69 73 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  is is useful for
1fcb0 20 74 65 73 74 69 6e 67 20 62 75 74 20 69 73 0a   testing but is.
1fcc0 20 20 20 20 2a 2a 20 75 6e 73 61 66 65 20 62 65      ** unsafe be
1fcd0 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 70 61  cause invalid pa
1fce0 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 6f 73  rameters to thos
1fcf0 65 20 69 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f  e internal-use-o
1fd00 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20  nly functions.  
1fd10 20 20 2a 2a 20 63 61 6e 20 72 65 73 75 6c 74 20    ** can result 
1fd20 69 6e 20 63 72 61 73 68 65 73 20 6f 72 20 73 65  in crashes or se
1fd30 67 66 61 75 6c 74 73 2e 0a 20 20 20 20 2a 2f 0a  gfaults..    */.
1fd40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fd50 54 45 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41  TESTCTRL_INTERNA
1fd60 4c 5f 46 55 4e 43 54 49 4f 4e 53 3a 20 7b 0a 20  L_FUNCTIONS: {. 
1fd70 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1fd80 61 6c 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72 6e  alConfig.bIntern
1fd90 61 6c 46 75 6e 63 74 69 6f 6e 73 20 3d 20 76 61  alFunctions = va
1fda0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1fdb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fdc0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1fdd0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1fde0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1fdf0 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
1fe00 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  int);.    **.   
1fe10 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72   ** Set or clear
1fe20 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
1fe30 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1fe40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1fe50 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20   always well-.  
1fe60 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20    ** formed and 
1fe70 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20  never corrupt.  
1fe80 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65  This flag is cle
1fe90 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69  ar by default, i
1fea0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20  ndicating that. 
1feb0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1fec0 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20  iles might have 
1fed0 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70  arbitrary corrup
1fee0 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74  tion.  Setting t
1fef0 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20  he flag during. 
1ff00 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61     ** testing ca
1ff10 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73  uses certain ass
1ff20 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1ff30 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20   in the code to 
1ff40 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20  be activated.   
1ff50 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74   ** that demonst
1ff60 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f  rat invariants o
1ff70 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  n well-formed da
1ff80 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20  tabase files..  
1ff90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ffa0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1ffb0 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20  VER_CORRUPT: {. 
1ffc0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1ffd0 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f  alConfig.neverCo
1ffe0 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61  rrupt = va_arg(a
1fff0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
20000 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
20010 20 2f 2a 20 53 65 74 20 74 68 65 20 74 68 72 65   /* Set the thre
20020 73 68 6f 6c 64 20 61 74 20 77 68 69 63 68 20 4f  shold at which O
20030 50 5f 4f 6e 63 65 20 63 6f 75 6e 74 65 72 73 20  P_Once counters 
20040 72 65 73 65 74 20 62 61 63 6b 20 74 6f 20 7a 65  reset back to ze
20050 72 6f 2e 0a 20 20 20 20 2a 2a 20 42 79 20 64 65  ro..    ** By de
20060 66 61 75 6c 74 20 74 68 69 73 20 69 73 20 30 78  fault this is 0x
20070 37 66 66 66 66 66 66 65 20 28 6f 76 65 72 20 32  7ffffffe (over 2
20080 20 62 69 6c 6c 69 6f 6e 29 2c 20 62 75 74 20 74   billion), but t
20090 68 61 74 20 76 61 6c 75 65 20 69 73 0a 20 20 20  hat value is.   
200a0 20 2a 2a 20 74 6f 6f 20 62 69 67 20 74 6f 20 74   ** too big to t
200b0 65 73 74 20 69 6e 20 61 20 72 65 61 73 6f 6e 61  est in a reasona
200c0 62 6c 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ble amount of ti
200d0 6d 65 2c 20 73 6f 20 74 68 69 73 20 63 6f 6e 74  me, so this cont
200e0 72 6f 6c 20 69 73 0a 20 20 20 20 2a 2a 20 70 72  rol is.    ** pr
200f0 6f 76 69 64 65 64 20 74 6f 20 73 65 74 20 61 20  ovided to set a 
20100 73 6d 61 6c 6c 20 61 6e 64 20 65 61 73 69 6c 79  small and easily
20110 20 72 65 61 63 68 61 62 6c 65 20 72 65 73 65 74   reachable reset
20120 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
20130 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
20140 45 53 54 43 54 52 4c 5f 4f 4e 43 45 5f 52 45 53  ESTCTRL_ONCE_RES
20150 45 54 5f 54 48 52 45 53 48 4f 4c 44 3a 20 7b 0a  ET_THRESHOLD: {.
20160 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
20170 62 61 6c 43 6f 6e 66 69 67 2e 69 4f 6e 63 65 52  balConfig.iOnceR
20180 65 73 65 74 54 68 72 65 73 68 6f 6c 64 20 3d 20  esetThreshold = 
20190 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
201a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
201b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
201c0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
201d0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
201e0 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
201f0 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72  , xCallback, ptr
20200 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
20210 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63 6f   Set the VDBE co
20220 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20  verage callback 
20230 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c  function to xCal
20240 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65  lback with conte
20250 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  xt .    ** point
20260 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  er ptr..    */. 
20270 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
20280 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
20290 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20  ERAGE: {.#ifdef 
202a0 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
202b0 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65 64  RAGE.      typed
202c0 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68  ef void (*branch
202d0 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  _callback)(void*
202e0 2c 75 6e 73 69 67 6e 65 64 20 69 6e 74 2c 0a 20  ,unsigned int,. 
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
20320 61 72 2c 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ar,unsigned char
20330 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20340 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
20350 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
20360 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
20370 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
20380 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
20390 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
203a0 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
203b0 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
203c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
203d0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
203e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
203f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
20400 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
20410 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
20420 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
20430 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
20440 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
20450 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
20460 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
20470 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
20480 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
20490 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
204a0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
204b0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
204c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
204d0 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
204e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
204f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20500 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
20510 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
20520 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
20530 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
20540 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
20550 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
20560 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
20570 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
20580 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
20590 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
205a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
205b0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
205c0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
205d0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
205e0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
205f0 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
20600 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
20610 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
20620 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
20630 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
20640 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
20650 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
20660 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
20670 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20680 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
20690 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
206a0 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
206b0 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
206c0 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
206d0 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
206e0 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
206f0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
20700 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
20710 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
20720 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
20730 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
20740 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
20750 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
20760 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
20770 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
20780 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
20790 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
207a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
207b0 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
207c0 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
207d0 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
207e0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
207f0 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
20800 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
20810 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
20820 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
20830 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
20840 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
20850 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
20860 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
20870 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
20880 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
20890 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
208a0 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
208b0 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
208c0 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
208d0 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
208e0 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
208f0 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
20900 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
20910 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
20920 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20930 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20940 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
20950 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20960 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
20970 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
20980 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
20990 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
209a0 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
209b0 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
209c0 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
209d0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
209e0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
209f0 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
20a00 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
20a10 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
20a20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
20a30 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
20a40 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
20a50 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
20a60 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
20a70 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
20a80 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
20a90 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
20aa0 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
20ab0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
20ac0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
20ad0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
20ae0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
20af0 66 20 64 65 66 69 6e 65 64 28 59 59 43 4f 56 45  f defined(YYCOVE
20b00 52 41 47 45 29 0a 20 20 20 20 2f 2a 20 20 73 71  RAGE).    /*  sq
20b10 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20b20 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20b30 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41  RL_PARSER_COVERA
20b40 47 45 2c 20 46 49 4c 45 20 2a 6f 75 74 29 0a 20  GE, FILE *out). 
20b50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
20b60 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 28  s test control (
20b70 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77  only available w
20b80 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 63 6f  hen SQLite is co
20b90 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 20 20  mpiled with.    
20ba0 2a 2a 20 2d 44 59 59 43 4f 56 45 52 41 47 45 29  ** -DYYCOVERAGE)
20bb0 20 77 72 69 74 65 73 20 61 20 72 65 70 6f 72 74   writes a report
20bc0 20 6f 6e 74 6f 20 22 6f 75 74 22 20 74 68 61 74   onto "out" that
20bd0 20 73 68 6f 77 73 20 61 6c 6c 0a 20 20 20 20 2a   shows all.    *
20be0 2a 20 73 74 61 74 65 2f 6c 6f 6f 6b 61 68 65 61  * state/lookahea
20bf0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 69  d combinations i
20c00 6e 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  n the parser sta
20c10 74 65 20 6d 61 63 68 69 6e 65 0a 20 20 20 20 2a  te machine.    *
20c20 2a 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  * which are neve
20c30 72 20 65 78 65 72 63 69 73 65 64 2e 20 20 49 66  r exercised.  If
20c40 20 61 6e 79 20 73 74 61 74 65 20 69 73 20 6d 69   any state is mi
20c50 73 73 65 64 2c 20 6d 61 6b 65 20 74 68 65 0a 20  ssed, make the. 
20c60 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64     ** return cod
20c70 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  e SQLITE_ERROR..
20c80 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20c90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20ca0 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a  PARSER_COVERAGE:
20cb0 20 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f   {.      FILE *o
20cc0 75 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ut = va_arg(ap, 
20cd0 46 49 4c 45 2a 29 3b 0a 20 20 20 20 20 20 69 66  FILE*);.      if
20ce0 28 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 43  ( sqlite3ParserC
20cf0 6f 76 65 72 61 67 65 28 6f 75 74 29 20 29 20 72  overage(out) ) r
20d00 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
20d10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20d20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64     }.#endif /* d
20d30 65 66 69 6e 65 64 28 59 59 43 4f 56 45 52 41 47  efined(YYCOVERAG
20d40 45 29 20 2a 2f 0a 20 20 7d 0a 20 20 76 61 5f 65  E) */.  }.  va_e
20d50 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f  nd(ap);.#endif /
20d60 2a 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  * SQLITE_UNTESTA
20d70 42 4c 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  BLE */.  return 
20d80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
20d90 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72  s is a utility r
20da0 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74  outine, useful t
20db0 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  o VFS implementa
20dc0 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63  tions, that chec
20dd0 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ks.** to see if 
20de0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
20df0 77 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63  was a URI that c
20e00 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69  ontained a speci
20e10 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61  fic query .** pa
20e20 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20  rameter, and if 
20e30 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76  so obtains the v
20e40 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72  alue of the quer
20e50 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  y parameter..**.
20e60 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
20e70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
20e80 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65   filename pointe
20e90 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  r passed into th
20ea0 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74  e xOpen().** met
20eb0 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70  hod of a VFS imp
20ec0 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
20ed0 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e  e zParam argumen
20ee0 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
20ef0 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61   the.** query pa
20f00 72 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e  rameter we seek.
20f10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
20f20 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
20f30 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a   of the zParam.*
20f40 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69  * parameter if i
20f50 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68  t exists.  If th
20f60 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73  e parameter does
20f70 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73   not exist, this
20f80 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
20f90 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  rns a NULL point
20fa0 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  er..*/.const cha
20fb0 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  r *sqlite3_uri_p
20fc0 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63  arameter(const c
20fd0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
20fe0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
20ff0 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65  am){.  if( zFile
21000 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61  name==0 || zPara
21010 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  m==0 ) return 0;
21020 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20  .  zFilename += 
21030 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
21040 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
21050 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61    while( zFilena
21060 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
21070 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c   x = strcmp(zFil
21080 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
21090 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
210a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
210b0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
210c0 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20  .    if( x==0 ) 
210d0 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
210e0 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
210f0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
21100 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
21110 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
21120 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
21130 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  rn a boolean val
21140 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
21150 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  arameter..*/.int
21160 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
21170 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  lean(const char 
21180 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
21190 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
211a0 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f  int bDflt){.  co
211b0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
211c0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
211d0 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  ter(zFilename, z
211e0 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20  Param);.  bDflt 
211f0 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65  = bDflt!=0;.  re
21200 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33  turn z ? sqlite3
21210 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44  GetBoolean(z, bD
21220 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a  flt) : bDflt;.}.
21230 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21240 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
21250 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79  alue for a query
21260 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
21270 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
21280 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a  ite3_uri_int64(.
21290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
212a0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46  ilename,    /* F
212b0 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65  ilename as passe
212c0 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20  d to xOpen */.  
212d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
212e0 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49  am,       /* URI
212f0 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68   parameter sough
21300 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
21310 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20  nt64 bDflt      
21320 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61   /* return if pa
21330 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69  rameter is missi
21340 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ng */.){.  const
21350 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
21360 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
21370 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
21380 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  am);.  sqlite3_i
21390 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20  nt64 v;.  if( z 
213a0 26 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48  && sqlite3DecOrH
213b0 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d  exToI64(z, &v)==
213c0 30 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d  0 ){.    bDflt =
213d0 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   v;.  }.  return
213e0 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bDflt;.}../*.**
213f0 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65   Return the Btre
21400 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69  e pointer identi
21410 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e  fied by zDbName.
21420 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
21430 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42   not found..*/.B
21440 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e  tree *sqlite3DbN
21450 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74  ameToBtree(sqlit
21460 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
21470 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
21480 69 6e 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d  int iDb = zDbNam
21490 65 20 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44  e ? sqlite3FindD
214a0 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d  bName(db, zDbNam
214b0 65 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  e) : 0;.  return
214c0 20 69 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d   iDb<0 ? 0 : db-
214d0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d  >aDb[iDb].pBt;.}
214e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
214f0 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74  he filename of t
21500 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
21510 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
21520 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
21530 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
21540 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  har *sqlite3_db_
21550 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33  filename(sqlite3
21560 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
21570 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74   *zDbName){.  Bt
21580 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66  ree *pBt;.#ifdef
21590 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
215a0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
215b0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
215c0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
215d0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
215e0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
215f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
21600 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
21610 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
21620 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
21630 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
21640 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
21650 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d  name(pBt) : 0;.}
21660 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
21670 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
21680 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69  read-only or 0 i
21690 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52  f read/write.  R
216a0 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e  eturn -1 if.** n
216b0 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20  o such database 
216c0 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  exists..*/.int s
216d0 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
216e0 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ly(sqlite3 *db, 
216f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
21700 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
21710 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
21720 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
21730 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
21740 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
21750 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
21760 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
21770 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  PT;.    return -
21780 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
21790 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
217a0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
217b0 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
217c0 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
217d0 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
217e0 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66  Bt) : -1;.}..#if
217f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
21800 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
21810 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68   Obtain a snapsh
21820 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  ot handle for th
21830 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61  e snapshot of da
21840 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65  tabase zDb curre
21850 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72  ntly .** being r
21860 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62  ead by handle db
21870 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21880 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
21890 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
218a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
218b0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ,.  sqlite3_snap
218c0 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f  shot **ppSnapsho
218d0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
218e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
218f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21900 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
21910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
21920 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
21930 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
21940 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
21950 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
21960 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
21970 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
21980 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
21990 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  ex);..  if( db->
219a0 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
219b0 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
219c0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
219d0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  (db, zDb);.    i
219e0 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
219f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65  >1 ){.      Btre
21a00 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
21a10 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
21a20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42   if( 0==sqlite3B
21a30 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
21a40 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
21a50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
21a60 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
21a70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
21a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21aa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
21ab0 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65  apshotGet(sqlite
21ac0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
21ad0 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  , ppSnapshot);. 
21ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
21b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
21b10 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
21b20 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
21b30 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
21b40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21b50 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74  ** Open a read-t
21b60 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
21b70 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64  e snapshot idend
21b80 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73 68  ified by pSnapsh
21b90 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
21ba0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
21bb0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
21bc0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
21bd0 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  zDb, .  sqlite3_
21be0 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
21bf0 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
21c00 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
21c10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21c20 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
21c30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
21c40 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
21c50 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
21c60 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
21c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
21c80 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
21c90 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
21ca0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
21cb0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
21cc0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
21cd0 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20  {.    int iDb;. 
21ce0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
21cf0 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
21d00 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
21d10 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
21d20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
21d30 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
21d40 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
21d50 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
21d60 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 7b 0a  rans(pBt)==0 ){.
21d70 20 20 20 20 20 20 20 20 50 61 67 65 72 20 2a 70          Pager *p
21d80 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
21d90 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
21da0 20 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c          int bUnl
21db0 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ock = 0;.       
21dc0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
21dd0 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70  eIsInReadTrans(p
21de0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
21df0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
21e00 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tive==0 ){.     
21e10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21e20 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
21e30 43 68 65 63 6b 28 70 50 61 67 65 72 2c 20 70 53  Check(pPager, pS
21e40 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
21e50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e70 20 20 20 20 20 20 20 20 20 62 55 6e 6c 6f 63 6b           bUnlock
21e80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
21e90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21ea0 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
21eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21ec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ee0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21ef0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
21f00 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
21f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21f20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21f30 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
21f40 70 65 6e 28 70 50 61 67 65 72 2c 20 70 53 6e 61  pen(pPager, pSna
21f50 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
21f60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
21f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21f80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21f90 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
21fa0 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  rans(pBt, 0, 0);
21fb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21fc0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
21fd0 70 65 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  pen(pPager, 0);.
21fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ff0 20 20 69 66 28 20 62 55 6e 6c 6f 63 6b 20 29 7b    if( bUnlock ){
22000 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22010 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 55  e3PagerSnapshotU
22020 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
22030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22040 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
22050 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
22060 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
22070 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
22080 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
22090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
220a0 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d 61  ** Recover as ma
220b0 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73 20  ny snapshots as 
220c0 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
220d0 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  e wal file assoc
220e0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73 63  iated with.** sc
220f0 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74 61  hema zDb of data
22100 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  base db..*/.int 
22110 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
22120 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33  _recover(sqlite3
22130 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
22140 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63   *zDb){.  int rc
22150 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
22160 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e  .  int iDb;.#ifn
22170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22180 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
22190 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
221a0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
221b0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
221c0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
221d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
221e0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
221f0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
22200 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
22210 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  x);.  iDb = sqli
22220 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
22230 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44  , zDb);.  if( iD
22240 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
22250 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
22260 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
22270 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  Bt;.    if( 0==s
22280 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
22290 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b  eadTrans(pBt) ){
222a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
222b0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
222c0 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  ns(pBt, 0, 0);. 
222d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
222e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
222f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22300 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76  gerSnapshotRecov
22310 65 72 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  er(sqlite3BtreeP
22320 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
22330 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22340 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
22350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
22360 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
22370 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
22380 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c  .#endif   /* SQL
22390 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
223a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
223b0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61  /*.** Free a sna
223c0 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74  pshot handle obt
223d0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
223e0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
223f0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
22400 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
22410 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  (sqlite3_snapsho
22420 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20  t *pSnapshot){. 
22430 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
22440 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64  napshot);.}.#end
22450 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
22460 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a  BLE_SNAPSHOT */.
22470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22480 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
22490 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47  ON_DIAGS./*.** G
224a0 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
224b0 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   a compile-time 
224c0 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74  option, return t
224d0 72 75 65 20 69 66 20 74 68 61 74 20 6f 70 74 69  rue if that opti
224e0 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61  on.** was used a
224f0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
22500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20  .**.** The name 
22510 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  can optionally b
22520 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54  egin with "SQLIT
22530 45 5f 22 20 62 75 74 20 74 68 65 20 22 53 51 4c  E_" but the "SQL
22540 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20  ITE_" prefix.** 
22550 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
22560 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a  for a match..*/.
22570 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  int sqlite3_comp
22580 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63  ileoption_used(c
22590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e  onst char *zOptN
225a0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  ame){.  int i, n
225b0 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20  ;.  int nOpt;.  
225c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43  const char **azC
225d0 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66  ompileOpt;. .#if
225e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
225f0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a  PI_ARMOR.  if( z
22600 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  OptName==0 ){.  
22610 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
22620 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
22630 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
22640 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c  ndif..  azCompil
22650 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  eOpt = sqlite3Co
22660 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f  mpileOptions(&nO
22670 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  pt);..  if( sqli
22680 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74  te3StrNICmp(zOpt
22690 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c  Name, "SQLITE_",
226a0 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d   7)==0 ) zOptNam
226b0 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71  e += 7;.  n = sq
226c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
226d0 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53  ptName);..  /* S
226e0 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72  ince nOpt is nor
226f0 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20  mally in single 
22700 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72  digits, a linear
22710 20 73 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a   search is .  **
22720 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65   adequate. No ne
22730 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
22740 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72  search. */.  for
22750 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b  (i=0; i<nOpt; i+
22760 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
22770 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74  te3StrNICmp(zOpt
22780 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f  Name, azCompileO
22790 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20  pt[i], n)==0.   
227a0 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 49 64    && sqlite3IsId
227b0 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63  Char((unsigned c
227c0 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  har)azCompileOpt
227d0 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29  [i][n])==0.    )
227e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
227f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22800 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
22810 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68   Return the N-th
22820 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
22830 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66  tion string.  If
22840 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
22850 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  ge,.** return a 
22860 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
22870 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
22880 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
22890 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20  on_get(int N){. 
228a0 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e   int nOpt;.  con
228b0 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70  st char **azComp
228c0 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70  ileOpt;.  azComp
228d0 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  ileOpt = sqlite3
228e0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26  CompileOptions(&
228f0 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d  nOpt);.  if( N>=
22900 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20  0 && N<nOpt ){. 
22910 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70     return azComp
22920 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20  ileOpt[N];.  }. 
22930 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
22940 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
22950 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
22960 5f 44 49 41 47 53 20 2a 2f 0a                    _DIAGS */.